正常做法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;
}