解题思路:就是枚举放弃的两个区间,直接是肯定爆炸的,但是我们差分和前缀和预处理一下就行了
#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;
}