Loading

代码-CF351D Jeff and Removing Periods(莫队 TLE)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);~i;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=1e5;
int n,qn,sq,a[N],rt[N+1];
vector<int> id[N];

//Moqueue
pair<int,int> q[N],*o[N];
int colcnt,seqcnt,cnt[N],ml=0,mr=-1;
multiset<int> st[N];
void ladd(int i=--ml){
    // cout<<"ladd(\n";
    if(!cnt[a[i]]) colcnt++,seqcnt++;
    else {
        int d=*upper_bound(id[a[i]].bg,id[a[i]].ed,i)-i;
        if(cnt[a[i]]==1) st[a[i]].insert(d);
        else {
            int t=*st[a[i]].rbegin();
            t==*st[a[i]].bg&&t!=d&&(seqcnt--),st[a[i]].insert(d);
        }
    }
    cnt[a[i]]++;
    // cout<<")\n";
}
void radd(int i=++mr){
    // cout<<"ladd(\n";
    if(!cnt[a[i]]) colcnt++,seqcnt++;
    else {
        int d=i-*prev(lower_bound(id[a[i]].bg,id[a[i]].ed,i));
        if(cnt[a[i]]==1) st[a[i]].insert(d);
        else {
            int t=*st[a[i]].rbegin();
            t==*st[a[i]].bg&&t!=d&&(seqcnt--),st[a[i]].insert(d);
        }
    }
    cnt[a[i]]++;
    // cout<<")\n";
}
void ldel(int i=ml++){
    // cout<<"ldel(\n";
    cnt[a[i]]--;
    if(!cnt[a[i]]) colcnt--,seqcnt--;
    else {
        int d=*upper_bound(id[a[i]].bg,id[a[i]].ed,i)-i;
        if(cnt[a[i]]==1) st[a[i]].erase(st[a[i]].lower_bound(d));
        else {
            bool b=(*st[a[i]].rbegin()==*st[a[i]].bg);
            st[a[i]].erase(st[a[i]].lower_bound(d));
            !b&&(*st[a[i]].rbegin()==*st[a[i]].bg)&&(seqcnt++);
        }
    }
    // cout<<")\n";
}
void rdel(int i=mr--){
    // cout<<"rdel(\n";
    cnt[a[i]]--;
    if(!cnt[a[i]]) colcnt--,seqcnt--;
    else {
        int d=i-*prev(lower_bound(id[a[i]].bg,id[a[i]].ed,i));
        if(cnt[a[i]]==1) st[a[i]].erase(st[a[i]].lower_bound(d));
        else {
            bool b=(*st[a[i]].rbegin()==*st[a[i]].bg);
            st[a[i]].erase(st[a[i]].lower_bound(d));
            !b&&(*st[a[i]].rbegin()==*st[a[i]].bg)&&(seqcnt++);
        }
    }
    // cout<<")\n";
}


//Main
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    R(i,n) cin>>a[i],--a[i],id[a[i]].pb(i);
    cin>>qn,sq=sqrt(qn)+1;
    R(i,qn) cin>>q[i].x>>q[i].y,--q[i].x,
        --q[i].y,o[i]=&q[i];
    sort(o,o+qn,[&](pair<int,int> *u,pair<int,int> *v){
        if(u->x/sq!=v->x/sq) return u->x<v->x;
        return ((u->x/sq)&1)?u->y<v->y:u->y>v->y;
    });
    R(i,qn){
        while(ml>o[i]->x) ladd();
        while(mr<o[i]->y) radd();
        while(ml<o[i]->x) ldel();
        while(mr>o[i]->y) rdel();
        o[i]->x=seqcnt?colcnt:colcnt+1;
    }
    R(i,qn) cout<<q[i].x<<'\n';
    return 0;
}
posted @ 2020-11-25 20:33  George1123  阅读(62)  评论(0编辑  收藏  举报