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
没有人不辛苦,只有人不喊疼
原文地址:https://www.cnblogs.com/ctyakwf/p/13398878.html