不会算主席树空间的蒟蒻自作聪明用了vector,然后就MLE了……(代码如下)
#include<bits/stdc++.h>
using namespace std;
inline void read(int &x){
x=0;
int y=1;
char a;
a=getchar();
while(a<'0'||a>'9'){
if(a=='-')y=-1;
a=getchar();
}
while(a>='0'&&a<='9'){
x=x*10+a-'0';
a=getchar();
}
x*=y;
}
int n,m;
int x;
int fz[1000008];
int f[1000008];
int fr[100008];
struct ffff{
int l,r;
int val;
};
vector<ffff>ft;
void fxiu(int now,int l,int r,int a){
if(l==r){
ft[now].val+=1;
return;
}
int mid=(l+r)>>1;
if(a<=mid){
ft.push_back(ft[ft[now].l]);
int fff=ft.size()-1;
ft[now].l=fff;
fxiu(fff,l,mid,a);
}
if(a>mid){
ft.push_back(ft[ft[now].r]);
int fff=ft.size()-1;
ft[now].r=fff;
fxiu(fff,mid+1,r,a);
}
ft[now].val=ft[ft[now].l].val+ft[ft[now].r].val;
}
int findans(int now,int l,int r,int a,int b){
if(a<=l&&b>=r){
return ft[now].val;
}
int mid=(l+r)>>1;
int fjg=0;
if(a<=mid)fjg+=findans(ft[now].l,l,mid,a,b);
if(b>mid)fjg+=findans(ft[now].r,mid+1,r,a,b);
return fjg;
}
int ff(int a){
return (x+a-1)%n+1;
}
int main(){
read(n);
for(int i=1;i<=n;++i)read(f[i]);
for(int i=1;i<=n;++i){
int a;read(a);
fz[a]=i;
}
//for(int i=1;i<=n;++i)cout<<fz[f[i]]<<endl;
ft.push_back(ffff{0,0,0});
ft.push_back(ffff{0,0,0});
fr[1]=1;
fxiu(1,1,n,fz[f[1]]);
for(int i=2;i<=n;++i){
fr[i]=ft.size();
ft.push_back(ft[fr[i-1]]);
fxiu(fr[i],1,n,fz[f[i]]);
}
read(m);
for(int i=1;i<=m;++i){
int l1,l2,r1,r2;
int a,b,c,d;
read(a);read(b);read(c);read(d);
l1=min(ff(a),ff(b));r1=max(ff(a),ff(b));
l2=min(ff(c),ff(d));r2=max(ff(c),ff(d));
int fans=findans(fr[r1],1,n,l2,r2);
if(l1>1)fans-=findans(fr[l1-1],1,n,l2,r2);
cout<<fans<<endl;
x=fans+1;
}
return 0;
}
然后一狠心开了贼大的数组,就A了(代码如下)
#include<bits/stdc++.h>
using namespace std;
inline void read(int &x){
x=0;
int y=1;
char a;
a=getchar();
while(a<'0'||a>'9'){
if(a=='-')y=-1;
a=getchar();
}
while(a>='0'&&a<='9'){
x=x*10+a-'0';
a=getchar();
}
x*=y;
}
int n,m;
int x;
int fz[1000008];
int f[1000008];
int fr[100008];
struct ffff{
int l,r;
int val;
};
ffff ft[28000008];
int qfz;
void fxiu(int now,int l,int r,int a){
if(l==r){
ft[now].val+=1;
return;
}
int mid=(l+r)>>1;
if(a<=mid){
++qfz;
ft[qfz]=ft[ft[now].l];
ft[now].l=qfz;
fxiu(qfz,l,mid,a);
}
if(a>mid){
++qfz;
ft[qfz]=ft[ft[now].r];
ft[now].r=qfz;
fxiu(qfz,mid+1,r,a);
}
ft[now].val=ft[ft[now].l].val+ft[ft[now].r].val;
}
int findans(int now,int l,int r,int a,int b){
if(a<=l&&b>=r){
return ft[now].val;
}
int mid=(l+r)>>1;
int fjg=0;
if(a<=mid&&ft[now].l)fjg+=findans(ft[now].l,l,mid,a,b);
if(b>mid&&ft[now].r)fjg+=findans(ft[now].r,mid+1,r,a,b);
return fjg;
}
int ff(int a){
return (x+a-1)%n+1;
}
int main(){
read(n);
for(int i=1;i<=n;++i)read(f[i]);
for(int i=1;i<=n;++i){
int a;read(a);
fz[a]=i;
}
++qfz;
fr[1]=1;
fxiu(1,1,n,fz[f[1]]);
for(int i=2;i<=n;++i){
++qfz;
fr[i]=qfz;
ft[fr[i]]=ft[fr[i-1]];
fxiu(fr[i],1,n,fz[f[i]]);
}
read(m);
for(int i=1;i<=m;++i){
int l1,l2,r1,r2;
int a,b,c,d;
read(a);read(b);read(c);read(d);
l1=min(ff(a),ff(b));r1=max(ff(a),ff(b));
l2=min(ff(c),ff(d));r2=max(ff(c),ff(d));
int fans=findans(fr[r1],1,n,l2,r2);
if(l1>1)fans-=findans(fr[l1-1],1,n,l2,r2);
printf("%d\n",fans);
x=fans+1;
}
return 0;
}
有没有巨佬教教我,为什么vector会MLE,不是变长数组吗?