求助CF E
  • 板块学术版
  • 楼主wzc_IOI_czl
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/7/12 01:39
  • 上次更新2023/11/3 10:25:29
查看原帖
求助CF E
539724
wzc_IOI_czl楼主2023/7/12 01:39

扩展域寄了

#include<iostream>
#define int long long
#ifdef int
#define inf 0x3f3f3f3f3f3f3f3fll
#else
#define inf 0x3f3f3f3f
#endif
#define maxn 200005

using namespace std;

int n, m, k, f[8005], a, b, c, d;

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

bool mge(int x, int y) {
	int fx = find(x), fy = find(y);
	if(fx == fy) return true;
	f[fx] = fy;
	return false;
}

void work() {
	cin >> n >> m >> k;
	if(n > 2000 || m > 2000) while(true);
	for(int i = 1; i <= 8000; i++) {
		f[i] = i;
	}
	for(int i = 1; i <= k; i++) {
		cin >> a >> b >> c >> d;
		int e = min(b, d) + 2000;
		if(b > d) {
			mge(a, e);
		}
		else {
			mge(a, e + 4000);
		}
 	}
	for(int i = 1; i <= n; i++) {
		if(find(i) == find(i + 4000)) {
			cout << "NO\n";
			return ;
		}
	}
	for(int i = 1; i <= m; i++) {
		if(find(i + 2000) == find(i + 6000)) {
			cout << "NO\n";
			return ;
		}
	}
	cout << "YES\n";
}

signed main() {
	int _;
	cin >> _;
	while(_--) work();
}

但染色过了。

#include<iostream>
#include<cstring>
#define int long long
#ifdef int
#define inf 0x3f3f3f3f3f3f3f3fll
#else
#define inf 0x3f3f3f3f
#endif
#define maxn 200005

using namespace std;

int n, m, k, h[4005], a, b, c1, d, en, c[4005];

struct edge {
	int v, w, next;
} e[8005];
void add(int u, int v, int w) {
	e[en] = (edge){v, w, h[u]};
	h[u] = en++;
}
bool color(int x, int cl) {
	if(c[x] != 0) {
		return cl == c[x];
	}
	c[x] = cl;
	bool flag = true;
	for(int j = h[x]; ~j; j = e[j].next) {
		flag = flag && color(e[j].v, cl * e[j].w);
	}
	return flag;
}

void work() {
	memset(h, 0xff, sizeof(h));
	memset(c, 0, sizeof(c));
	en = 0;
	cin >> n >> m >> k;
	if(n > 2000 || m > 2000) while(true);
	for(int i = 1; i <= k; i++) {
		cin >> a >> b >> c1 >> d;
		int e = min(b, d) + 2000;
		if(b > d) {
			add(a, e, 1);
			add(e, a, 1);
		}
		else {
			add(a, e, -1);
			add(e, a, -1);
		}
 	}
 	bool flag = true;
 	for(int i = 1; i <= 4000; i++) {
 		if(c[i] == 0) {
 			flag = flag && color(i, 1);
		}
	}
	if(flag) cout << "YES\n";
	else cout << "NO\n";
}

signed main() {
	int _;
	cin >> _;
	while(_--) work();
}

为啥?

2023/7/12 01:39
加载中...