WA on #14 求助 QAQ
查看原帖
WA on #14 求助 QAQ
560516
喵仔牛奶楼主2023/3/18 19:45

测评记录:https://codeforces.com/problemset/submission/555/197903665

#include <bits/stdc++.h>
using namespace std;
namespace Milkcat {
	const int N = 1e6 + 5;
	struct edge {
		int u, to, next;
	} e[N << 1];
	int n, m, q, u, v, tot, edge_cnt, cnt;
	int lg[N], d1[N], d2[N], pwp[N], depth[N], dfn[N], low[N], bel[N], head[N], f[N][22];
	bool cut[N << 1], vis[N];
	vector<int> ans[N], G[N];
	unordered_set<int> s[N];
	void add(int u, int v) {
		e[++ edge_cnt].to = v;
		e[edge_cnt].u = u;
		e[edge_cnt].next = head[u];
		head[u] = edge_cnt;
	}
	void tarjan(int u, int in) {
		dfn[u] = low[u] = ++ tot;
		for (int i = head[u]; i; i = e[i].next) {
			int v = e[i].to;
			if (!dfn[v]) tarjan(v, i), low[u] = min(low[u], low[v]);
			else if (i != (in ^ 1)) low[u] = min(low[u], low[v]);
			if (low[v] > dfn[u]) cut[i] = cut[i ^ 1] = 1;
		}
	}
	void dfs(int u, int id) {
		ans[id].push_back(u), bel[u] = id, vis[u] = 1;
		for (int i = head[u]; i; i = e[i].next) {
			int v = e[i].to;
			if (vis[v] || cut[i]) continue;
			dfs(v, id);
		}
	}
	void dfs1(int u, int fat) {
		f[u][0] = fat, depth[u] = depth[fat] + 1;
		for (int v : G[u]) if (v != fat) dfs1(v, u);
	}
	void dfs2(int u, int fat) {
		for (int v : G[u])
			if (v != fat) dfs2(v, u), d1[u] += d1[v], d2[u] += d2[v];
	}
	int LCA(int x, int y) {
		if (depth[x] < depth[y]) swap(x, y);
		while (depth[x] > depth[y])
			x = f[x][lg[depth[x] - depth[y]]];
		if (x == y) return x;
		for (int i = 20; i >= 0; i --)
			if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
		return f[x][0];
	}
	int main() {
		cin >> n >> m >> q, edge_cnt = 1;
		for (int i = 2; i <= n; i ++) lg[i] = lg[i >> 1] + 1;
		for (int i = 1; i <= m; i ++)
			cin >> u >> v, add(u, v), add(v, u);
		for (int i = 1; i <= n; i ++)
			if (!dfn[i]) tarjan(i, 0);
		for (int i = 1; i <= n; i ++)
			if (!vis[i]) dfs(i, ++ cnt);
		for (int i = 1; i <= edge_cnt; i ++) {
			int u = bel[e[i].u], v = bel[e[i].to];
			if (cut[i] && !s[u].count(v))
				G[u].push_back(v), s[u].insert(v);
		}
//		for (int i = 1; i <= edge_cnt; i ++)
//			if (cut[i]) cout << "qwq " << e[i].u << ' ' << e[i].to << '\n';
		dfs1(1, 0);
		for (int i = 1; i <= edge_cnt; i ++) {
			if (!cut[i] || (i & 1)) continue;
			int u = bel[e[i].u], v = bel[e[i].to];
			if (depth[u] < depth[v]) swap(u, v);
			pwp[u] ++;
		}
		for (int j = 1; j <= 20; j ++)
			for (int i = 1; i <= n; i ++)
				f[i][j] = f[f[i][j - 1]][j - 1];
//		puts("----");
//		for (int i = 1; i <= cnt; i ++) {
//			for (int u : G[i]) cout << u << ' ';
//			cout << '\n';
//		}
//		puts("----");
		for (int i = 1; i <= q; i ++) {
			cin >> u >> v;
			int lca = LCA(bel[u], bel[v]);
//			cout << bel[u] << ' ' << bel[v] << ' ' << lca << '\n';
			d1[bel[u]] ++, d1[lca] --;
			d2[bel[v]] ++, d2[lca] --;
		}
		dfs2(1, 0);
		for (int i = 1; i <= n; i ++)
			if (pwp[i] < bool(d1[i]) + bool(d2[i])) puts("No"), exit(0);
		puts("Yes");
		return 0;
	}
}
int main() {
	return Milkcat::main();
}

2023/3/18 19:45
加载中...