Loading

代码-几道回滚莫队

洛谷P5906 【模板】回滚莫队&不删除莫队

#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(register int i(0);i<(n);++i)
#define L(i,n) for(register int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//ReadWrite
const int BUF=1<<20;
static char buf[BUF],*p1=buf,*p2=buf,obuf[BUF],*p3=obuf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,BUF,stdin),p1==p2)?EOF:*p1++
#define putchar(x) (p3-obuf<BUF)?(*p3++=x):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=x)
template<typename item>void read(item &x){
    x=0; item f=1; char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    x*=f;
}
template<typename item>void write(item x){
	if(x<0) x=-x,putchar('-');
	if(x>9) write(x/10); putchar(((x%10)^48));
}
struct Flusher{~Flusher(){fwrite(obuf,p3-obuf,1,stdout);}}flusher;

//Data
const int N=2e5;
int n,m,a[N],A,d[N],C,B,b[N],mn[N],mx[N];
struct que{int l,r,i,ns;}q[N],*o[N];

//Main
int main(){
    read(n),C=sqrt(n/3)+1,B=(n+C-1)/C;
    R(i,n) read(a[i]),d[A++]=a[i],b[i]=i/C;
    sort(d,d+A),A=unique(d,d+A)-d;
    R(i,n) a[i]=lower_bound(d,d+A,a[i])-d;
    read(m);
    R(i,m) read(q[i].l),read(q[i].r),--q[i].l,--q[q[i].i=i].r,o[i]=&q[i];
    sort(o,o+m,[&](que *u,que *v){return
        b[u->l]!=b[v->l]?b[u->l]<b[v->l]:u->r<v->r;});
    for(register int i=0,j=0;j<B;++j){
        register int mr=min(n,(j+1)*C),l=mr,r=mr-1,ns=0,tp=-1;
        R(t,A) mx[t]=mn[t]=-1;
        for(;i<m&&b[o[i]->l]==j;++i){
            if(b[o[i]->r]==j){
                int &res=o[i]->ns=0;
                for(register int t=o[i]->l;t<=o[i]->r;++t)
                    !~mn[a[t]]?(mn[a[t]]=t):(res=max(res,t-mn[a[t]]));
                for(register int t=o[i]->l;t<=o[i]->r;++t) mn[a[t]]=-1;
            } else {
                while(r<o[i]->r) !~mx[a[++r]]?(mx[a[r]]=mn[a[r]]=r):
                    (ns=max(ns,(mx[a[r]]=r)-mn[a[r]])); tp=ns;
                while(l>o[i]->l) !~mx[a[--l]]?(mx[a[l]]=l):(ns=
                    max(ns,mx[a[l]]-l)); o[i]->ns=ns,ns=tp;
                while(l<mr) mx[a[l]]==l&&(mx[a[l]]=-1),++l;
            }
        }
    }
    R(i,m) write(q[i].ns),putchar('\n');
    return 0;
}

AT1219 歴史の研究

#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(register int i(0);i<(n);++i)
#define L(i,n) for(register int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=1e5;
int n,m,a[N],A,d[N],B,C,b[N],cn[N];
struct que{int l,r,i; ll ns;}q[N],*o[N];

//Main
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m,C=sqrt(n/2)+1,B=(n+C-1)/C;
    R(i,n) cin>>a[i],d[A++]=a[i],b[i]=i/C;
    sort(d,d+A),A=unique(d,d+A)-d;
    R(i,n) a[i]=lower_bound(d,d+A,a[i])-d;
    R(i,m) cin>>q[i].l>>q[i].r,--q[i].l,--q[i].r,o[q[i].i=i]=&q[i];
    sort(o,o+m,[&](que *u,que *v){return b[u->l]!=b[v->l]?u->l<v->l:u->r<v->r;});
    for(int i=0,j=0;j<B;j++){
        int mr=min(n,(j+1)*C),l=mr,r=mr-1; ll ns=0,tp=-1;
        R(t,A) cn[t]=0;
        for(;i<m&&b[o[i]->l]==j;i++){
            if(b[o[i]->r]==j){
                ll &res=o[i]->ns;
                for(int t=o[i]->l;t<=o[i]->r;t++)
                    ++cn[a[t]],res=max(res,1ll*cn[a[t]]*d[a[t]]);
                for(int t=o[i]->l;t<=o[i]->r;t++) cn[a[t]]=0;
            } else {
                while(r<o[i]->r) ++cn[a[++r]],ns=max(ns,1ll*cn[a[r]]*d[a[r]]); tp=ns;
                while(l>o[i]->l) ++cn[a[--l]],ns=max(ns,1ll*cn[a[l]]*d[a[l]]);
                while(l<mr) --cn[a[l++]]; o[i]->ns=ns,ns=tp;
            }
        }
    }
    R(i,m) cout<<q[i].ns<<'\n';
    return 0;
}

洛谷P4137 Rmq Problem / mex

#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(register int i(0);i<(n);++i)
#define L(i,n) for(register int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=2e5;
int n,m,a[N],B,C,b[N],cn[N|2];
struct que{int l,r,i,ns;}q[N],*o[N];

//Main
int main(){
    // ios::sync_with_stdio(0);
    // cin.tie(0),cout.tie(0);
    cin>>n>>m,C=sqrt(n>>1)+1,B=(n+C-1)/C;
    R(i,n) cin>>a[i],b[i]=i/C;
    R(i,m) cin>>q[i].l>>q[i].r,--q[i].l,--q[i].r,o[q[i].i=i]=&q[i];
    sort(o,o+m,[&](que *u,que *v){return b[u->l]!=b[v->l]?u->l<v->l:u->r>v->r;});
    for(int i=0,j=0;i<m&&j<B;j++){
        int ml=j*C,l=ml,r=o[i]->r,ns=0,tp=-1;
        memset(cn,0,sizeof(cn));
        for(int t=l;t<=r;t++) ++cn[a[t]];
        R(t,N+1)if(!cn[t]){ns=t; break;}
        for(;i<m&&b[o[i]->l]==j;i++){
            while(r>o[i]->r) !--cn[a[r]]&&a[r]<ns&&(ns=a[r]),--r; tp=ns;
            while(l<o[i]->l) !--cn[a[l]]&&a[l]<ns&&(ns=a[l]),++l;
            while(l>ml) ++cn[a[--l]]; o[i]->ns=ns,ns=tp;
        }
    }
    R(i,m) cout<<q[i].ns<<'\n';
    return 0;
}
posted @ 2020-12-20 19:03  George1123  阅读(12)  评论(0编辑  收藏  举报