解题思路:就是枚举放弃的两个区间,直接是肯定爆炸的,但是我们差分和前缀和预处理一下就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e4 + 5;
int n,q,sum[maxn],num[maxn];
int l[maxn],r[maxn];
int main(){
cin>>n>>q;
for(int i=1;i<=q;++i) cin>>l[i]>>r[i];
int tot=0,ans=-1;
for(int i=1;i<=q-1;++i){ //放弃i区间
memset(sum,0,sizeof(int)*(n+1));
memset(num,0,sizeof(int)*(n+1));
tot=0;
for(int k=1;k<i;++k) sum[l[k]]++,sum[r[k]+1]--;
for(int k=i+1;k<=q;++k) sum[l[k]]++,sum[r[k]+1]--;
for(int k=1;k<=n;++k){
sum[k]+=sum[k-1];
num[k]=num[k-1];
if(sum[k]>0) tot++;
if(sum[k]==1) num[k]++; //统计到k涂改1的个数
}
for(int k=i+1;k<=q;++k){ //放弃k区间
ans=max(ans,tot-(num[r[k]]-num[l[k]-1]));
}
}
cout<<ans<<endl;
return 0;
}
本文介绍了一种使用枚举法和差分前缀和技巧解决区间覆盖问题的算法。通过放弃两个区间并预处理数据,实现了高效求解最大未覆盖区间的数量。文章详细展示了算法的实现过程,包括初始化变量、双重循环遍历区间、更新差分数组和统计结果。
668

被折叠的 条评论
为什么被折叠?



