30pts求调
查看原帖
30pts求调
1403759
Cailibur楼主2024/11/9 12:12
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int t,n;
vector<int> alls; //声明变长数组用于进行离散化

int find(int x){      //二分查找变长数组中的数据 
	int l = 0 , r = alls.size();
	while(l < r - 1){
		int mid = l + (r - l) / 2;
		if(alls[mid] >= x) r = mid;
		else l = mid;
	}
	return r;
}

int F(int a , int* f){              //并查集搜索 
	if(f[a] != a) return F(f[a] , f);
	else return a;
}

int main(){
	scanf("%d",&t);
	for(int i = 0 ; i < t ; i++){
		scanf("%d",&n);
		int f[100005] ={0};
		int ops1[100005][2] = {0};
		int ops2[100005][2] = {0};
		int x1 = 0 , x2 = 0;
		for(int j = 0 ; j < 100005; j++)f[j] = j;    //init
		for(int j = 0 ; j < n ; j++){
			int a, b ,e;
			scanf("%d %d %d",&a , &b , &e);
			//输入vector 
			alls.push_back(a);
			alls.push_back(b);
			//存储操作 
			if(e == 1){
				ops1[j][0] = a;
				ops1[j][1] = b;
				x1++;
			}
			else{
				ops2[j][0] = a;
				ops2[j][1] = b;
				x2++;
			}
		}
		//排序+去重 
		sort(alls.begin(),alls.end());
		alls.erase(unique(alls.begin(),alls.end()),alls.end());
		//并查集操作 
		for(int j = 0 ; j < x1 ; j++){
			int a = find(ops1[j][0]);
			int b = find(ops1[j][1]);
//			printf("%d %d\n",a ,b);
			f[F(a ,f)] = F(b , f);				//合并父亲 
		}
		//查询 
		int flag = 0;
		for(int j = 0 ; j < x2 ; j++){
			int a = find(ops2[j][0]);
			int b = find(ops2[j][1]);
//			printf("%d %d\n",a ,b);
			if(f[a] == f[b]){
				flag = 1;
				break;
			}
		}
		if(flag == 1)printf("NO\n");
		else printf("YES\n");
		alls.erase(alls.begin(),alls.end());     //释放 
	}
}

30分,3TLE,4WA,测试样例过了,求大佬调试T T

使用了vector进行离散化,自己写了个二分用于查找对应数据,WA的点全部都是该YES的地方是NO,求大佬指点迷津orz

2024/11/9 12:12
加载中...