Codeforces - CF1132CPainting the Fence

题目链接:Codeforces - CF1132CPainting the Fence


先枚举第一个删除的人。

然后枚举第二个,利用前缀和优化计算。

每次第二个人会消除的贡献只是覆盖后为1的地方,前缀和计算1的地方的个数即可。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=5010;
int n,m,l[N],r[N],sum[N],num[N],res,ans;
signed main(){
     
	cin>>n>>m;
	for(int i=1;i<=m;i++) cin>>l[i]>>r[i];
	for(int i=1;i<=m;i++){
     
		memset(sum,0,sizeof sum),memset(num,0,sizeof num),ans=0;
		for(int j=1;j<=m;j++) if(i!=j) sum[l[j]]++,sum[r[j]+1]--;
		for(int j=1;j<=n;j++) sum[j]+=sum[j-1],num[j]=num[j-1]+(sum[j]==1),ans+=(sum[j]>0);
		for(int j=1;j<=m;j++) if(i!=j) res=max(res,ans-num[r[j]]+num[l[j]-1]);
	}
	cout<<res;
	return 0;
}

你可能感兴趣的:(前缀和,Codeforces,思维题)