疑问
查看原帖
疑问
800499
suzhikz楼主2024/11/6 21:39

本人做法是整体二分,原本是直接二分答案下标的区间,这么做WA了,改成二分答案就可以了这是为什么?

WA代码

void dfs(int al,int ar,vector<int>&ask){
	if(al>ar)return;
	if(ask.size()==0)return;
	int mid=(z[al].w+z[ar].w)/2;
	int pos=0;
	for(int i=al;i<=ar;i++){
		if(z[i].w<=mid){
			update(z[i].x,z[i].y,1);
		}else{
			break;
		}
		pos=i;
	}
	vector<int>dl,dr;
	for(int i:ask){
		if(askk(i)>=k[i]){
			ans[i]=mid;
			dl.push_back(i);
		}else{
			dr.push_back(i);
		}
	}
	dfs(pos+1,ar,dr);
	for(int i=al;i<=pos;i++){
		update(z[i].x,z[i].y,-1);
	}
	dfs(al,pos-1,dl);
}

ac代码```cpp void dfs(int al,int ar,vector&ask){ if(al>ar)return; if(ask.size()==0)return; if(al==ar){ for(int i:ask){ ans[i]=z[al].w; } return; } int mid=z[(al+ar)/2].w; int pos=0; for(int i=al;i<=(al+ar)/2;i++){ if(z[i].w<=mid){ update(z[i].x,z[i].y,1); }else{ break; } pos=i; } vectordl,dr; for(int i:ask){ if(askk(i)>=k[i]){ ans[i]=mid; dl.push_back(i); }else{ dr.push_back(i); } } dfs(pos+1,ar,dr); for(int i=al;i<=pos;i++){ update(z[i].x,z[i].y,-1); } dfs(al,pos,dl); }

2024/11/6 21:39
加载中...