求助大佬
查看原帖
求助大佬
771308
newcabbage楼主2022/10/23 21:51

##为什么第一个lower bound要用a[i]-1,我不明白##0.0 ##谢谢

 #include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;

const int N =10010;

struct Node{
	int l;
	int r;
	int p;
};

int fa[N], ra[N];
long long x[N], y[N], h[N];
char ops[9];

void init(int n){
	for(int i=1;i<=n;i++){
		fa[i] = i;
		ra[i] = 0;
	}
}

int find(int x){
	int fx, t, y, s;
	
	s = 0;
	fx = x;
	
	while(fa[fx] != fx){
		s += ra[fx];
		fx = fa[fx];
	}
	
	while(fa[x] != fx){
		t = fa[x];
		fa[x] = fx;
		
		y = ra[x];
		ra[x] = s % 2;
		s -= y;
		
		x = t;
	}
	return fx;
}

void merge(int x, int y, int r){
	int fx, fy;
	
	fx = find(x);
	fy = find(y);
	
	fa[fx] = fy;
	ra[fx] = (ra[x] + ra[y] + r) % 2;
}

Node a[N];

int main(){
	int n, m, T, k, len, fx, fy, i, fz, z;
	
	scanf("%d%d", &n, &m);
	
	T = 0;
	k =0;
	
	for(int i=1;i<=m;i++){
		scanf("%lld%lld%s", &a[i].l, &a[i].r, ops);
		
		if(ops[0] == 'e'){
			a[i].p = 0;
		}else{
			a[i].p = 1;
		}
		
		k++;
		h[k] = a[i].l;
		k++;
		h[k] = a[i].r;
	}
		
		sort(h+1, h+k+1);
		
		len = unique(h+1, h+k+1) - (h+1);
		
		init(2*m); 
		
		for(int i=1;i<=m;i++){
			
		a[i].l = lower_bound(h+1, h+len+1, a[i].l-1) - h;
		a[i].r = lower_bound(h+1, h+len+1, a[i].r) - h;
		
		T++;
		
		fx = find(a[i].l);
		fy = find(a[i].r);
		
		if(fx != fy){
			merge(a[i].l, a[i].r, a[i].p);
		}else{
			z = (ra[a[i].l] + ra[a[i].r]) % 2;
			if(z != a[i].p){
				T = T - 1;
				break;
			}
		}
	}
	printf("%d", T);
	return 0;
} ``` 
2022/10/23 21:51
加载中...