25分纯暴力求法
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int> >p;
int cnt[2000010];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
p.push_back({a,b});
}
int l,r,k;
long long ans=0;
for(l=1;l<=n;l++){
for(r=l+1;r<=n;r++){
memset(cnt,0,sizeof(cnt));
for(k=0;k<m;k++){
if(p[k].first>=l&&p[k].second<=r){
for(int z=p[k].first;z<=p[k].second;z++){
cnt[z]=1;
}
}
}
int flag=0;
for(int z=l;z<=r;z++){
if(cnt[z]==0){
flag=1;break;
}
}
if(flag==0)ans++;
}
}
cout<<ans;
}
差分改进(虽然分数没变。。
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int> >p;
int cnt[2000010];
int d[2000010];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
p.push_back({a,b});
}
int l,r,k;
long long ans=0;
for(l=1;l<=n;l++){
for(r=l+1;r<=n;r++){
memset(cnt,0,sizeof(cnt));
memset(d,0,sizeof(d));
for(k=0;k<m;k++){
if(p[k].first>=l&&p[k].second<=r){
d[p[k].first]++;
d[p[k].second+1]--;
}
}
for(int z=l;z<=r;z++){
cnt[z]=cnt[z-1]+d[z];
}
int flag=0;
for(int z=l;z<=r;z++){
if(cnt[z]==0){
flag=1;break;
}
}
if(flag==0)ans++;
}
}
cout<<ans;
}