2 条题解

  • 0
    @ 2025-10-22 10:44:15

    我写的代码参考了梁意森的。这个做法颇为巧妙,有一些巧妙的小 trick。注意细节,比如区间边界什么的。

    贴代码,思路略。

    #include<bits/stdc++.h>
    using namespace std;
    int m,n=200,k,bs,ans,a[205][205],c[205][205],f[205][205],t[205];
    int cal(int X1,int Y1,int X2,int Y2){
    	return a[X2][Y2]-a[X1][Y2]-a[X2][Y1]+a[X1][Y1];
    }
    int main(){
    	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    	cin>>m>>k;
    	for(int i=1;i<=m;i++){
    		int X1,Y1,X2,Y2;
    		cin>>X1>>Y1>>X2>>Y2;
    		X1++,Y1++,X2++,Y2++;//坑了,题目里面是xy平面,题目说的左下角实际上是数组里的左上角 
    //		swap(X1,X2); //不该这么做
    		c[X1][Y1]++,c[X2][Y1]--,c[X1][Y2]--,c[X2][Y2]++;
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			c[i][j]+=c[i-1][j]+c[i][j-1]-c[i-1][j-1];
    			if(c[i][j]==k-1)a[i][j]=1;
    			if(c[i][j]==k)a[i][j]=-1,bs++;
    			a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
    		}
    	}
    	for(int r=1;r<=n;r++){//注意以下矩阵左上角都是开的,并且l开r闭 
    		for(int l=0;l<r;l++){
    			int tmp=-0x3f3f3f3f,sum=0;
    			if(l>0)t[l]=max(t[l],t[l-1]);//巧妙,这一步使得所有前面的t[]值都被拿来打擂台算答案了 
    			for(int x=1;x<=n;x++)sum=max(0,sum)+cal(x-1,l,x,r),tmp=max(tmp,sum);
    			ans=max(ans,tmp+t[l]),t[r]=max(t[r],tmp);
    		}
    	}
    	memset(t,0,sizeof(t));
    	for(int r=1;r<=n;r++){
    		for(int l=0;l<r;l++){
    			int tmp=-0x3f3f3f3f,sum=0;
    			if(l>0)t[l]=max(t[l],t[l-1]);
    			for(int y=1;y<=n;y++)sum=max(0,sum)+cal(l,y-1,r,y),tmp=max(tmp,sum);
    			ans=max(ans,tmp+t[l]),t[r]=max(t[r],tmp);
    		}
    	}
    	cout<<ans+bs;
    	return 0;
    }
    
    • 1

    信息

    ID
    6959
    时间
    2000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    62
    已通过
    7
    上传者