这两段代码有什么区别?
查看原帖
这两段代码有什么区别?
373938
wowwowwow楼主2022/7/29 12:41

本蒟蒻用并查集写的,大概就是用g[i]存下一个要染色的点(包括点i)

1.WA代码(j从l到r)

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n, m, p, q, col[1010101], g[1010101];
//col[]是颜色
int find(int x){
	if(g[x] == x) return x;
	return g[x] = find(g[x]);
}

signed main(){
	scanf("%lld\n%lld\n%lld\n%lld", &n, &m, &p, &q);
	for(int i = 1; i <= n; i++){
		g[i] = i;
	}
	for(int i = m; i >= 1; i--){
		int l = (i * p + q) % n + 1, r = (i * q + p) % n + 1;
		if(l > r) swap(l, r);
		for(int j = l; j <= r;){ 
			int t = find(j); //找到没染色的 
            if(t == j){
            	col[t] = i;
				g[t] = find(t + 1);
			}
		    j = g[j];
		}
	}
	for(int i = 1; i <= n; i++){
		printf("%lld\n", col[i]);
	}
	return 0;
}

2.ACdaima(j从r到l)

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n, m, p, q, col[1010101], g[1010101];

int find(int x){
	if(g[x] == x) return x;
	return g[x] = find(g[x]);
}

signed main(){
	scanf("%lld\n%lld\n%lld\n%lld", &n, &m, &p, &q);
	for(int i = 1; i <= n; i++){
		g[i] = i;
	}
	for(int i = m; i >= 1; i--){
		int l = (i * p + q) % n + 1, r = (i * q + p) % n + 1;
		if(l > r) swap(l, r);
//		cout << i << endl;
		for(int j = r; j >= l;){
			int t = find(j); //找到没染色的 
//			cout << t << " ";
            if(t == j){
            	col[t] = i;
//			if(t + 1 >= r) break;
				g[t] = find(t - 1);
			}
		    j = g[j];
			
		}
//		cout << endl;
	}
	for(int i = 1; i <= n; i++){
		printf("%lld\n", col[i]);
	}
	return 0;
}
2022/7/29 12:41
加载中...