CF1167E Range Deleting(双指针)
本题如果删除l-r,那么l-r+1...这些也都是满足的,因此具有单调性。
所以我们考虑枚举l,r,对于判断,维护四个数组
分别为l[],当前数出现的最早时间
r[],当前数出现的最晚时间
ll[],1-i出现的最早时间
rr[],i-n出现的最晚时间
对于满足的状态要分三种情况讨论
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e6+10; const int mod=998244353; int ll[N],rr[N],l[N],r[N]; int a[N]; int main(){ ios::sync_with_stdio(false); int i; int n,x; cin>>n>>x; memset(l,0x3f,sizeof l); memset(r,-1,sizeof r); memset(ll,0x3f,sizeof ll); memset(rr,-1,sizeof rr); for(i=1;i<=n;i++){ cin>>a[i]; l[a[i]]=min(l[a[i]],i); r[a[i]]=i; } for(i=1;i<=x;i++){ rr[i]=max(r[i],rr[i-1]); } for(i=x;i>=1;i--){ ll[i]=min(l[i],ll[i+1]); } int k=x; while(k>1&&ll[k]>=r[k-1]) k--; LL ans=0; for(i=0;i<x;i++){ if(i&&(l[i]<rr[i-1])) break; while(k<=i+1||ll[k]<rr[i]) k++; ans+=x-k+2; } cout<<ans<<endl; return 0; }
没有人不辛苦,只有人不喊疼