萌新求助
查看原帖
萌新求助
319671
Reliauk楼主2022/7/14 09:33

WA,0pts

#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;

int n, m, k, fa[N << 1], siz[N << 1];
struct Node {
	vector<array<int, 2>> e;
	int l, r;
} t[N << 2];
stack<int> s;

void build(int o, int l, int r) {
	t[o].l = l, t[o].r = r;
	if (l == r) return;
	int mid = l + r >> 1;
	build(o * 2, l, mid), build(o * 2 + 1, mid + 1, r);
}
void ins(int o, array<int, 2> a, int l, int r) {
	int L = t[o].l, R = t[o].r;
	if (l <= L && R <= r) return t[o].e.emplace_back(a), void();
	if (l > R || L > r) return;
	ins(o * 2, a, l, r), ins(o * 2 + 1, a, l, r);
}
int get(int x) { return x - fa[x] ? get(fa[x]) : x; }
inline void merge(int u, int v) {
	if (u == v) return;
	if (siz[u] > siz[v]) swap(u, v);
	s.push(u), fa[u] = v, siz[v] += siz[u];
}
void dfs(int u) {
	int hav = 0, tp = s.size();
	for (auto a : t[u].e) {
		int u = get(a[0]), v = get(a[1]);
		if (u == v) {
			hav = 1;
			for (int i = t[u].l; i <= t[u].r; ++i) cout << "No\n";
			break;
		}
		merge(u, get(a[1] + n)), merge(get(a[0] + n), v);
	}
	if (!hav) {
		if (t[u].l == t[u].r) cout << "Yes\n";
		else dfs(u * 2), dfs(u * 2 + 1);
	}
	while (s.size() > tp) siz[fa[s.top()]] -= siz[s.top()], fa[s.top()] = s.top(), s.pop();
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m >> k, build(1, 1, k), iota(fa + 1, fa + 2 * n + 1, 1);
  for (int i = 1; i <= 2 * n; ++i) siz[i] = 1;
  for (int i = 0, x, y, l, r; i < m; ++i) {
  	cin >> x >> y >> l >> r;
  	if (l != r) ins(1, {x, y}, l + 1, r);
	}
  return dfs(1), 0;
}

做法就是普通的线段树分治+扩展域并查集,不知道为什么全 wa 掉了/ll

2022/7/14 09:33
加载中...