题解:P11800 【MX-X9-T4】『GROI-R3』区间
这个题还是比较有趣的。
首先分析一下题目,题目中给出了一个比较奇怪的限制,区间长度不同。一般来说,这种限制要么是为了保证题目有解,要么是保证复杂度。这题中显然不是前者,但具体是如何保证复杂度的,我们先继续思考。
另外,发现除了
题目给出的条件其实是说对于给定的
具体分析一下,若有一个区间
令
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5,M=1e6,inf=2e18;
struct node{
int l,r;
}b[M],c[N];
bool cmp(node a,node b){
return a.l<b.l;
}
int n,m,v,a,l,r,L[N+10],R[N+10],cnt;
signed main(){
scanf("%lld%lld%lld",&n,&m,&v);
memset(R,127,sizeof R);
for(int i=1;i<=n;i++){
scanf("%lld",&a);
L[a]=R[a]=a;
}
for(int i=1;i<=N;i++){
L[i]=max(L[i],L[i-1]);
}
for(int i=N;i>=1;i--){
R[i]=min(R[i],R[i+1]);
}
c[0]={inf,inf};
for(int i=1;i<=m;i++){
scanf("%lld%lld",&l,&r);
int len=r-l,cnt0=0;
for(int ll=1;ll<=N;ll+=len+1){
int rr=ll+len;
if(rr>N)rr=N;
int a1=R[ll],a2=L[rr];
if(a1>rr||a2<ll)continue;
int LL=l-a2,RR=r-a1;
if(RR<1)continue;
if(LL<1)LL=1;
if(LL>v)continue;
if(RR>v)RR=v;
c[++cnt0]={LL,RR};
}
int lll=c[cnt0].l,rrr=c[cnt0].r;
for(int j=cnt0-1;j>=0;j--){
if(c[j].r<=rrr)continue;
if(c[j].l<=rrr)rrr=c[j].r;
else{
b[++cnt]={lll,rrr};
lll=c[j].l,rrr=c[j].r;
}
}
}
sort(b+1,b+1+cnt,cmp);
int ans=v,mx=0;
for(int i=1;i<=cnt;i++){
if(b[i].r<=mx)continue;
if(b[i].l<=mx)ans-=(b[i].r-mx);
else ans-=(b[i].r-b[i].l+1);
mx=b[i].r;
}
cout<<ans;
return 0;
}