离散化求调教
查看原帖
离散化求调教
754502
_AyachiNene楼主2023/5/24 20:47
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    struct node
    {
    	int x,y,idx,idy;
    }a[114514];
    struct node1
    {
    	int x,y;
    }c[114][514];
    int n,K;
    int cnt,b[114514],vis[114][514],ans=LONG_LONG_MAX,maxx,maxy;
    signed main()
    {
        cin>>n>>K;
        for(int i=1;i<=n;i++)
        	cin>>a[i].x>>a[i].y,b[++cnt]=a[i].x,b[++cnt]=a[i].y;
        sort(1+b,1+b+cnt);
    	int sum=unique(b+1,b+1+cnt)-b;
    	for(int i=1;i<=n;i++)
    	{
    		a[i].idx=lower_bound(b+1,b+1+sum,a[i].x)-b;
    		a[i].idy=lower_bound(b+1,b+1+sum,a[i].y)-b;
    		c[a[i].idx][a[i].idy].x=a[i].x,c[a[i].idx][a[i].idy].y=a[i].y;
    		vis[a[i].idx][a[i].idy]=1;
    		maxx=max(maxx,a[i].idx),maxy=max(maxy,a[i].idy);
    	}
    	for(int i=0;i<=maxx;i++)                //位置 
    		for(int j=0;j<=maxy;j++)
    		{
    			int maxxx=0,maxyy=0,miny=INT_MAX,minx=INT_MAX,sum=0;
    			for(int k=1;k<=maxx-i+1;k++)        //长宽 
    				for(int l=1;l<=maxy-j+1;l++)
    				{
    					if(vis[i+k-1][j+l-1])
    					{
    						maxxx=max(maxxx,c[i+k-1][j+l-1].x);
    						maxyy=max(maxyy,c[i+k-1][j+l-1].y);
    						minx=min(minx,c[i+k-1][j+l-1].x);
    						miny=min(miny,c[i+k-1][j+l-1].y);
    						sum++;
    					}
    					if(sum==K)
    						ans=min(ans,(maxxx-minx)*(maxyy-miny));
    				}
    		}
    //	for(int i=1;i<=maxx;i++)
    //	{
    //		for(int j=1;j<=maxy;j++)
    //			cout<<c[i][j].x<<","<<c[i][j].y<<"  ";
    ////			cout<<vis[i][j]<<' ';
    //		cout<<endl;
    //	}
    	cout<<ans;
    }
2023/5/24 20:47
加载中...