bug求调
查看原帖
bug求调
168596
ProjectCF楼主2024/1/23 09:27

三个点全WA 样例AC

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <stdlib.h>
#include <time.h>
#include <map>
#include <complex>
#include <math.h>
#include <stack>
#include <unordered_map>
#include <set>
#include <string.h>
using namespace std;
int to[1000010], nxt[1000010], head[300010], cnt;
int dfn[100010], low[100010], d2c, dc, vis[100010];
stack<int> st;
int fa[300010], fi[300010][22], dep[300010], Dfn[300010], Dc, pf[300010];
int n;
int tmp[100010];
void add(int a, int b) {
	to[++cnt] = b;
	nxt[cnt] = head[a];
	head[a] = cnt;
}
void tar(int u) {
	dfn[u] = low[u] = ++dc;
	st.push(u);
	vis[u] = 1;
	for (int j = head[u]; j; j = nxt[j]) {
		int v = to[j];
		if (!dfn[v]) {
			tar(v);
			low[u] = min(low[u], low[v]);
			if (low[v] >= dfn[u]) {
				d2c++;
				int w;
			yu:
				w = st.top();
				st.pop();
				add(d2c + 2 * n, w + n);
				add(w + n, d2c + 2 * n);
				vis[w] = 0;
				if (!st.empty() && w != u)goto yu;
				vis[u] = 1;
				st.push(u);
			}
		}
		else if (vis[v]) {
			low[u] = min(low[u], dfn[v]);
		}
	}
}
void dfs(int u, int f) {
	fa[u] = f;
	dep[u] = dep[f] + 1;
	Dfn[u] = ++Dc;
	pf[u] = pf[f] + (u <= 2 * n);
	for (int j = head[u]; j; j = nxt[j])if (to[j] != f)dfs(to[j], u);
}
int lca(int x, int y) {
	if (dep[x] > dep[y])swap(x, y);
	for (int k = 20; k >= 0; k--)if (dep[x] <= dep[fi[y][k]])y = fi[y][k];
	for (int k = 20; k >= 0; k--)if (fi[x][k] != fi[y][k])x = fi[x][k], y = fi[y][k];
	if (x == y)return x;
	return fa[x];
}
int cmp(int a, int b) {
	return Dfn[a] < Dfn[b];
}
signed main() {
	ios::sync_with_stdio(0);
	int T;
	cin >> T;
	for (int I = 1; I <= T; I++) {
		int m;
		cin >> n >> m;
		cnt = 0;
		for (int i = 1; i <= n; i++)dfn[i] = low[i] = vis[i] = 0;
		for (int i = 1; i <= 3 * n; i++)head[i] = fa[i] = dep[i] = Dfn[i] = pf[i] = 0;
		d2c = dc = Dc = 0;
		for (int i = 1; i <= m; i++) {
			int u, v;
			cin >> u >> v;
			add(u, v);
			add(v, u);
		}
		while (!st.empty())st.pop();
		tar(1);
		//cout << d2c << endl;
		//for (int i = n + 1; i <= 2 * n + d2c; i++)for (int j = head[i]; j; j = nxt[j])cout << i - n << " " << to[j] - n << "Q" << endl;
		dfs(2 * n + 1, 0);
		for (int i = n + 1; i <= 2 * n + d2c; i++)fi[i][0] = fa[i];
		for (int k = 1; k <= 20; k++)for (int i = n + 1; i <= 2 * n + d2c; i++)fi[i][k] = fi[fi[i][k - 1]][k - 1];
		int Q;
		cin >> Q;
		for (int J = 1; J <= Q; J++) {
			int k;
			cin >> k;
			for (int i = 1; i <= k; i++)cin >> tmp[i], tmp[i] += n;
			sort(tmp + 1, tmp + k + 1, cmp);
			int ans = 0;
			for (int i = 1; i <= k; i++) {
				int a = tmp[i], b = tmp[i == k ? 1 : i + 1];
				int l = lca(a, b);
				ans += pf[a] + pf[b] - 2 * pf[l];
			}
			cout << ans / 2 + (lca(tmp[1], tmp[k]) <= 2 * n) - k << endl;
		}
	}
	return 0;
}

2024/1/23 09:27
加载中...