1 solutions

  • 1
    @ 2024-10-5 14:02:59
    /*
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,q,a[1005][1005],b[2005],tot;
    bool cmp(int x,int y){return x>y;}
    int main() {
    	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    	cin>>n>>m>>q;
    	for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin>>a[i][j];
    	for(int i=1; i<=q; i++) 
    	{
    		int x,y,k,tot=0;
    		cin>>x>>y>>k;
    		for(int o=1;o<=n;o++) b[++tot]=a[o][y];
    		for(int o=1; o<=m; o++) if(o!=y)b[++tot]=a[x][o];
    		nth_element(b+1,b+k,b+1+tot,cmp);
    		cout<<b[k]<<endl;
    	}
    	return 0;
    }
    */
    /*70分(nth_element())*/
    /*
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[2005][2005],b[100005],q;
    int li[2005][2005],co[2005][2005];
    bool cmp(int x,int y) {return x>y;}
    int main()
    {
    	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    	cin>>n>>m>>q;
    	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
    	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) li[i][j]=a[i][j];		
    	for(int i=1;i<=n;i++) sort(li[i]+1,li[i]+1+m,cmp);
    	for(int j=1;j<=m;j++) for(int i=1;i<=n;i++) co[j][i]=a[i][j];	
    	for(int i=1;i<=m;i++) sort(co[i]+1,co[i]+1+n,cmp);
    	for(int i=1;i<=q;i++)
    	{
    		int tot=0;
    		int x,y,k;
    		cin>>x>>y>>k;
    		int nl=1,nr=1;
    		while(nl<=n&&nr<=m)
    		{
    			if(co[y][nl]>li[x][nr]) b[++tot]=co[y][nl],nl++;
    			else b[++tot]=li[x][nr],nr++;	
    		}
    		while(nl<=n) b[++tot]=co[y][nl],nl++;
    		while(nr<=m) b[++tot]=li[x][nr],nr++;
    		int flag=0;
    		for(int ii=1;ii<k;ii++) if(b[ii]==b[ii+1]) flag=1; 
    		if(flag) k++;
    		cout<<b[k]<<endl;
    	}
    	return 0;
    }
    */
    /*100分(归并排序)*/
    /*
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[1005][1005],b[1005][1005],q,x[100005],y[100005],k[100005],r[10005],o=0;
    int li[1005][1005],co[1005][1005];
    bool cmp(int x,int y) {return x>y;}
    int main()
    {
    	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    	cin>>n>>m>>q;
    	for(int i=1;i<=n;i++) for(int j=1; j<=m; j++) cin>>a[i][j];
    	for(int i=1;i<=q;i++) cin>>x[i]>>y[i]>>k[i];
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			li[i][j]=a[i][j];
    	for(int i=1;i<=n;i++) sort(li[i]+1,li[i]+1+m,cmp);
    	for(int i=1;i<=m;i++)
    		for(int j=1;j<=n;j++)
    			co[i][j]=a[j][i];
    	for(int i=1;i<=m;i++) sort(co[i]+1,co[i]+1+n,cmp);
    	for(int i=1;i<=q;i++) {
    		int w,g;
    		for(g=1,w=1;g<=m,w<=n;) {
    			if(li[x[i]][g]>co[y[i]][w]) {
    				r[++o]=li[x[i]][g];
    				g++;
    			} else if(li[x[i]][g]<co[y[i]][w]) {
    				r[++o]=co[y[i]][w];
    				w++;
    			} else {
    				r[++o]=co[y[i]][w];
    				w++;
    			}
    		}
    		while(w<=n) 
    		{
    			r[++o]=co[y[i]][w];
    			w++;
    		}
    		while(g<=m) 
    		{
    			r[++o]=li[x[i]][g];
    			g++;
    		}
    		for(int ii=1; ii<k[i]; ii++) if(r[ii]==r[ii+1]) k[i]++;
    		cout<<r[k[i]]<<endl;
    		r[10005]= {0};
    		o=0;
    	}
    	return 0;
    }
    */
    /*100分(归并排序) again*/ 
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,q;
    int a[1005][1005],b[200005],tot=0;
    int li[1005][1005],co[1005][1005];
    bool check(int x,int y,int k,int s)
    {
    	int cnt=0;
    	int l=0,r=m,ans1=0,ans2=0;
    	while(l<=r)
    	{
    		int mid=(l+r)>>1;
    		if(li[x][mid]>=s||mid==0) ans1=mid,l=mid+1;
    		else r=mid-1;
    	 } 
    	l=0,r=n;
    	while(l<=r)
    	{
    		int mid=(l+r)>>1;
    		if(co[y][mid]>=s||mid==0) ans2=mid,l=mid+1;
    		else r=mid-1;
    	} 	
    	cnt=ans1+ans2;
    	if(a[x][y]>=s) cnt--;
    	return cnt>=k;
    }
    bool cmp(int x,int y)
    {
    	return x>y;
    }
    int main()
    {
    	cin>>n>>m>>q;
    	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
    	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) li[i][j]=a[i][j];
    	for(int i=1;i<=n;i++) sort(li[i]+1,li[i]+1+m,cmp);
    	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) co[i][j]=a[j][i];
    	for(int i=1;i<=m;i++) sort(co[i]+1,co[i]+1+n,cmp);
    	while(q--)
    	{	
    		int x,y,k,ans=0;
    		cin>>x>>y>>k;
    		int l=1,r=n*m;
    		while(l<=r)
    		{
    			int mid=(l+r)>>1;
    			if(check(x,y,k,mid)) ans=mid,l=mid+1;
    			else r=mid-1;
    		}
    		cout<<ans<<endl;
    	}
    	return 0;
    }
    /*(二分) */
    

    Information

    ID
    551
    Time
    2500ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    (None)
    # Submissions
    87
    Accepted
    10
    Uploaded By