RE求调
查看原帖
RE求调
536745
WaTleZero_pt楼主2024/5/8 20:55
#include<bits/stdc++.h>
using namespace std;
int t,n,m,q;
int hi[200010];
struct Edge{
	int hi,realhi,lo;
}edge[200010];
struct Query{
	int mx,a,b,id;
}query[200010];
int ans[200010];
bool cmp(Edge a,Edge b){
	return a.realhi<=b.realhi;
}
bool cmp2(Query a,Query b){
	return a.mx<=b.mx; 
}
int fa[200010];
int Find(int x){
	if(fa[x]==x) return x;
	return fa[x]=Find(fa[x]);
}
void Merge(int x,int y){
	x=Find(x); y=Find(y);
	if(x==y) return;
	fa[x]=y;
}
bool Connected(int x,int y){
	return Find(x)==Find(y);
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++) fa[i]=i;
		for(int i=1;i<=n;i++) scanf("%d",&hi[i]);
		int mx=0;
		for(int i=1;i<=m;i++){
			scanf("%d%d",&edge[i].hi,&edge[i].lo);
			if(hi[edge[i].hi]<hi[edge[i].lo])
				swap(edge[i].hi,edge[i].lo);
			edge[i].realhi=hi[edge[i].hi];
		}
		sort(edge+1,edge+m+1,cmp); //RE HERE
		scanf("%d",&q);
		for(int i=1;i<=q;i++) ans[i]=0;
		for(int i=1;i<=q;i++){
			query[i].id=i;
			scanf("%d%d%d",&query[i].a,&query[i].b,&query[i].mx);
			query[i].mx+=hi[query[i].a];
		}
		sort(query+1,query+q+1,cmp2);
		int p=1;
		for(int i=1;i<=m;i++){
			while(hi[edge[i].hi]>query[p].mx&&p<=q){
				if(Connected(query[p].a,query[p].b)) ans[query[p].id]=1;
				p++;
			}
			Merge(edge[i].hi,edge[i].lo);
		}
		while(p<=q){		if(Connected(query[p].a,query[p].b)) ans[query[p].id]=1;
				p++;
		}
		for(int i=1;i<=q;i++)
			if(ans[i]==1) printf("Yes\n");
			else printf("No\n");
		putchar('\n'); 
	}
}

为什么第 4545 行的 sortsort 语句数据大的时候会 RE,求调

2024/5/8 20:55
加载中...