悬关求助,AC但疑惑(树状数组+主席树)
查看原帖
悬关求助,AC但疑惑(树状数组+主席树)
376045
Mr_RoastFish楼主2024/10/11 19:03

我感觉这两份代码没什么大区别(只有离散化时用数组或vector),为什么一个用数组的AC,用vector的WA。只有在2操作,给排名求数中出了问题(我自己跑对拍也没什么问题)而且问题出现在查询的ans为序列最大值时,getnum返回值一个为倒数第二(WA),一个为倒数第一(AC)

提供一组hack

input:
10 9
8337 16231 7816 13417 26218 3375 23410 32287 22051 21646 
1 8 10 4010
4 2 7 12105
4 7 10 24643
1 10 10 17720
4 5 10 30846
3 9 22051
5 2 3 14550
4 9 10 971
2 7 9 3

output AC :
1
7816
23410
1
26218
16231
-2147483647
32287

output WA:
1
7816
23410
1
26218
16231
-2147483647
30846

数组代码:

int query_num(int l,int r,int k){
	if(l==r)	return l;
	int sum=0;
	for(int i=1;i<=cntall;i++)	sum+=node[node[allno[i]].ls].val;
	for(int i=1;i<=cntpre;i++)	sum-=node[node[allpre[i]].ls].val;
	if(k<=sum){
		for(int i=1;i<=cntall;i++)	allno[i]=node[allno[i]].ls;
		for(int i=1;i<=cntpre;i++)	allpre[i]=node[allpre[i]].ls;
		return query_num(l,mid,k);
	}else{
		for(int i=1;i<=cntall;i++)	allno[i]=node[allno[i]].rs;
		for(int i=1;i<=cntpre;i++)	allpre[i]=node[allpre[i]].rs;
		return query_num(mid+1,r,k-sum);
	}
}
int getnum(int l,int r,int k){
	cntpre=cntall=0;
	for(int i=r;i;i-=lowbit(i))	allno[++cntall]=rt[i];
	for(int i=l-1;i;i-=lowbit(i))	allpre[++cntpre]=rt[i];
	return query_num(1,len,k);
}

int main(){
	//freopen("t.out","r",stdin);
	//freopen("1.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>gval[i];uni[++len]=gval[i];	
	} 
	for(int i=1;i<=m;i++){
		cin>>q[i].opt>>q[i].l>>q[i].r;
		if(q[i].opt!=3)	cin>>q[i].k;	
		else	uni[++len]=q[i].r;
		if(q[i].opt==4||q[i].opt==5)	uni[++len]=q[i].k;
	}
	sort(uni+1,uni+1+len);
	len=unique(uni+1,uni+1+len)-uni-1;//cout<<len<<" fuck CCF\n";
	for(int i=1;i<=n;i++)	gval[i]=lower_bound(uni+1,uni+1+len,gval[i])-uni,add(i,1);//cout<<(gval[i])<<'\n';
	uni[0]=-2147483647,uni[len+1]=2147483647;
	for(int i=1;i<=m;i++){
		switch(q[i].opt){
			case 1:cout<<getrnk(q[i].l,q[i].r,lower_bound(uni+1,uni+1+len,q[i].k)-uni)<<endl;break;
			case 2:cout<<uni[getnum(q[i].l,q[i].r,q[i].k)]<<endl;break;
			case 3:add(q[i].l,-1);gval[q[i].l]=lower_bound(uni+1,uni+1+len,q[i].r)-uni;add(q[i].l,1);break;
			case 4:cout<<uni[getpre(q[i].l,q[i].r,lower_bound(uni+1,uni+1+len,q[i].k)-uni)]<<endl;break;
			default:cout<<uni[getbck(q[i].l,q[i].r,lower_bound(uni+1,uni+1+len,q[i].k)-uni)]<<endl;break;
		}
	}
	return 0;
}

vector代码:

int query_num(int l,int r,int k){
	if(l==r)	return l;
	int sum=0;
	for(int i=1;i<=cntall;i++)	sum+=node[node[allno[i]].ls].val;
	for(int i=1;i<=cntpre;i++)	sum-=node[node[allpre[i]].ls].val;
	if(k<=sum){
		for(int i=1;i<=cntall;i++)	allno[i]=node[allno[i]].ls;
		for(int i=1;i<=cntpre;i++)	allpre[i]=node[allpre[i]].ls;
		return query_num(l,mid,k);
	}else{
		for(int i=1;i<=cntall;i++)	allno[i]=node[allno[i]].rs;
		for(int i=1;i<=cntpre;i++)	allpre[i]=node[allpre[i]].rs;
		return query_num(mid+1,r,k-sum);
	}
}
int getnum(int l,int r,int k){
	cntpre=cntall=0;
	for(int i=r;i;i-=lowbit(i))	allno[++cntall]=rt[i];
	for(int i=l-1;i;i-=lowbit(i))	allpre[++cntpre]=rt[i];
	return query_num(1,len,k);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>gval[i];uni.push_back(gval[i]);	
	} 
	for(int i=1;i<=m;i++){
		cin>>q[i].opt>>q[i].l>>q[i].r;
		if(q[i].opt!=3)	cin>>q[i].k;	
		else	uni.push_back(q[i].r);
		if(q[i].opt==4||q[i].opt==5)	uni.push_back(q[i].k);
	}
	sort(uni.begin(),uni.end());
	len=unique(uni.begin(),uni.end())-uni.begin()-1;//cout<<len<<" fuck CCF\n";
	for(int i=1;i<=n;i++)	gval[i]=lower_bound(uni.begin(),uni.end(),gval[i])-uni.begin()+1,add(i,1);//cout<<(gval[i])<<'\n';
	for(int i=1;i<=m;i++){
		switch(q[i].opt){
			case 1:cout<<getrnk(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)<<endl;break;
			case 2:cout<<(getnum(q[i].l,q[i].r,q[i].k)-1==-1?-2147483647:uni[getnum(q[i].l,q[i].r,q[i].k)-1])<<endl;break;
			case 3:add(q[i].l,-1);gval[q[i].l]=lower_bound(uni.begin(),uni.end(),q[i].r)-uni.begin()+1;add(q[i].l,1);break;
			case 4:cout<<(getpre(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)-1==-1?-2147483647:uni[getpre(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)-1])<<endl;break;
			default:cout<<(getbck(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)==len+1?2147483647:uni[getbck(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)-1])<<endl;break;
		}
	}
	return 0;
}                                  
2024/10/11 19:03
加载中...