1. 程式人生 > 實用技巧 >CF1167E Range Deleting(雙指標)

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; }
View Code