好奇,为什么这样就对了?
查看原帖
好奇,为什么这样就对了?
332304
寺中言楼主2021/12/2 22:08

不会算主席树空间的蒟蒻自作聪明用了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,不是变长数组吗?

2021/12/2 22:08
加载中...