主席树做法求助!!!
查看原帖
主席树做法求助!!!
632236
gan1234楼主2023/8/5 20:26

正常做法mle了几个点

#include<bits/stdc++.h>
#define MAXN 1000005
using namespace std;
struct Seg_tree{
    int l,r,ls,rs,s;
}dat[MAXN*40];
int a[MAXN],pre[MAXN],T[MAXN];
int rt[MAXN];
int cnt=1;
int n,m;
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
inline void wr(int x){if(x>=10)wr(x/10);putchar(x%10+'0');}
inline void wrn(int x){wr(x);putchar('\n');}
int clone(int k){
    dat[++cnt]=dat[k];
    return cnt;
}
int update(int x,int z,int k){
    int t=clone(k);
    if(dat[k].l==x&&dat[k].r==x){
        dat[t].s+=z;
        return t;
    }
    int m=(dat[k].l+dat[k].r)/2;
    if(x<=m){
        if(!dat[k].ls)dat[k].ls=++cnt,dat[cnt].l=dat[k].l,dat[cnt].r=m;
        dat[t].ls=update(x,z,dat[k].ls);
    }else{
        if(!dat[k].rs)dat[k].rs=++cnt,dat[cnt].r=dat[k].r,dat[cnt].l=m+1;
        dat[t].rs=update(x,z,dat[k].rs);
    } 
    dat[t].s=dat[dat[t].ls].s+dat[dat[t].rs].s;
    return t;
}
int query(int x,int y,int k){
    if(dat[k].l==x&&dat[k].r==y)return dat[k].s;
    int m=(dat[k].l+dat[k].r)/2;
    if(y<=m&&dat[k].ls)return query(x,y,dat[k].ls);
    else if(x>m&&dat[k].rs)return query(x,y,dat[k].rs);
    else if(x<=m&&y>m){
        int res=0;
        if(dat[k].ls)res+=query(x,m,dat[k].ls);
        if(dat[k].rs)res+=query(m+1,y,dat[k].rs);
        return res;
    }
    return 0;
}
int main(){
    n=read();
    for(int i=1;n>=i;i++)a[i]=read(),pre[i]=T[a[i]],T[a[i]]=i;
    rt[0]=1;
    dat[1].l=1;dat[1].r=n;
    int t;
    for(int i=1;n>=i;i++){
        if(pre[i]!=0)t=update(pre[i],-1,rt[i-1]);
        else t=rt[i-1];
        rt[i]=update(i,1,t);
    }
    int x,y;
    m=read();
    for(int i=1;m>=i;i++){
        x=read(),y=read();
        wrn(query(x,y,rt[y]));
    }
    return 0;
}

改进了一下,又全wa了

#include<bits/stdc++.h>
#define MAXN 1000005
using namespace std;
struct Seg_tree{
    int l,r,ls,rs,s;
}dat[MAXN*40];
int a[MAXN],pre[MAXN],T[MAXN];
int rt[MAXN];
int cnt=1;
int n,m;
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
inline void wr(int x){if(x>=10)wr(x/10);putchar(x%10+'0');}
inline void wrn(int x){wr(x);putchar('\n');}
int clone(int k){
    dat[++cnt]=dat[k];
    return cnt;
}
int update(int x,int z,int k){
    int t=clone(k);
    if(dat[k].l==x&&dat[k].r==x){
        dat[t].s+=z;
        return t;
    }
    int m=(dat[k].l+dat[k].r)/2;
    if(x<=m){
        if(!dat[k].ls)dat[k].ls=++cnt,dat[cnt].l=dat[k].l,dat[cnt].r=m;
        dat[t].ls=update(x,z,dat[k].ls);
    }else{
        if(!dat[k].rs)dat[k].rs=++cnt,dat[cnt].r=dat[k].r,dat[cnt].l=m+1;
        dat[t].rs=update(x,z,dat[k].rs);
    } 
    dat[t].s=dat[dat[t].ls].s+dat[dat[t].rs].s;
    return t;
}
int update2(int x,int z,int k){
    if(dat[k].l==x&&dat[k].r==x){
        int t=clone(k);
        dat[t].s+=z;
        return t;
    }
    int m=(dat[k].l+dat[k].r)/2;
    if(x<=m){
        if(!dat[k].ls)dat[k].ls=++cnt,dat[cnt].l=dat[k].l,dat[cnt].r=m;
        dat[k].ls=update2(x,z,dat[k].ls);
    }else{
        if(!dat[k].rs)dat[k].rs=++cnt,dat[cnt].r=dat[k].r,dat[cnt].l=m+1;
        dat[k].rs=update2(x,z,dat[k].rs);
    } 
    dat[k].s=dat[dat[k].ls].s+dat[dat[k].rs].s;
    return k;
}
int query(int x,int y,int k){
    if(dat[k].l==x&&dat[k].r==y)return dat[k].s;
    int m=(dat[k].l+dat[k].r)/2;
    if(y<=m&&dat[k].ls)return query(x,y,dat[k].ls);
    else if(x>m&&dat[k].rs)return query(x,y,dat[k].rs);
    else if(x<=m&&y>m){
        int res=0;
        if(dat[k].ls)res+=query(x,m,dat[k].ls);
        if(dat[k].rs)res+=query(m+1,y,dat[k].rs);
        return res;
    }
    return 0;
}
int main(){
    n=read();
    for(int i=1;n>=i;i++)a[i]=read(),pre[i]=T[a[i]],T[a[i]]=i;
    rt[0]=1;
    dat[1].l=1;dat[1].r=n;
    int t;
    for(int i=1;n>=i;i++){
        rt[i]=update(i,1,rt[i-1]);
        if(pre[i]!=0)update2(pre[i],-1,rt[i]);
    }
    int x,y;
    m=read();
    for(int i=1;m>=i;i++){
        x=read(),y=read();
        wrn(query(x,y,rt[y]));
    }
    return 0;
}
2023/8/5 20:26
加载中...