2 条题解
-
0
我写的代码参考了梁意森的。这个做法颇为巧妙,有一些巧妙的小 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; } -
0
- 1
信息
- ID
- 6959
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 62
- 已通过
- 7
- 上传者