求 Hack
查看原帖
求 Hack
534654
zhenjianuo2025楼主2023/1/12 11:48

Record99456304,测试点全输出 00

对拍无果,小数据拍不出问题,大数据纯随机答案很小(不超过 55),也拍不出来。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define mp make_pair
#define fi first
#define pb push_back
#define se second
const int mod = 1e9 + 7;
int n, f[300010], cnt[300010], son[300010][3], siz[300010], dep[100010], sup[300010], anc[300010][25];
vector<int> g[300010];
int find(int u, int d) {
	for (int i = 22; i >= 0; i--)
		if (anc[u][i] && dep[anc[u][i]] <= d) u = anc[u][i];
	if (dep[u] != d) u = 0; return u;
}
int Yyc(int v1, int v2) {
	if (siz[v1] > siz[v2]) swap(v1, v2);
	if (!sup[v1]) {
		if (!sup[v2] || (dep[sup[v2]] - dep[v2] + 1 > siz[v1])) {
			int w = find(v2, dep[v2] + siz[v1]);
			return w ? f[w] : 1;
		}
	}
	return 0;
}
void dp(int u, int fa) {
	siz[u] = 1;
	for (int i = 0; i < g[u].size(); i++) {
		int v = g[u][i];
		if (v == fa) continue;
		dep[v] = dep[u] + 1;
		dp(v, u);
		anc[u][0] = v;
		sup[u] = sup[v];
		siz[u] += siz[v];
		son[u][cnt[u]++] = v;
		if (cnt[u] >= 3) {
			cout << "0\n";
			exit(0);
		}
	}
	for (int j = 1; j <= 22; j++) anc[u][j] = anc[anc[u][j - 1]][j - 1];
	if (!cnt[u]) {
		f[u] = 1;
	} else if (cnt[u] == 1) {
		if (cnt[son[u][0]] == 0) f[u]++;
		if (cnt[son[u][0]] == 1) f[u] += f[son[son[u][0]][0]];
		f[u] += f[son[u][0]];
		if (sup[u]) {
			int v1 = son[sup[u]][0], v2 = son[sup[u]][1];
//				cout << v1  << " " << v2 << " QAQA\n";
			if (!sup[v1] && (dep[v1] - dep[u] == siz[v1] || dep[v1] - dep[u] - 1 == siz[v1] + 1)) {
				f[u] += f[v2];
			} 
			if (!sup[v2] && (dep[v2] - dep[u] == siz[v2] || dep[v2] - dep[u] - 1 == siz[v2] + 1)) {
				f[u] += f[v1];
			}
			bool fl = 1;
			if (cnt[v1] == 2) {
				int w1 = v2, w2 = son[v1][1], z = son[v1][0];
				if (fl && !sup[z] && siz[z] + 1 == dep[v1] - dep[u]) {
					if (Yyc(w1, w2)) {
						fl = 1;
						f[u] += Yyc(w1, w2);
					}
				}
				swap(son[v1][0], son[v1][1]); w2 = son[v1][1], z = son[v1][0];
				if (fl && !sup[z] && siz[z] + 1 == dep[v1] - dep[u]) {
					if (Yyc(w1, w2)) {
						fl = 1;
						f[u] += Yyc(w1, w2);
					}
				}
			}
			swap(v1, v2);
			if (cnt[v1] == 2) {
				int w1 = v2, w2 = son[v1][1], z = son[v1][0];
				if (fl && !sup[z] && siz[z] + 1 == dep[v1] - dep[u]) {
					if (Yyc(w1, w2)) {
						fl = 1;
						f[u] += Yyc(w1, w2);
					}
				}
				swap(son[v1][0], son[v1][1]); w2 = son[v1][1], z = son[v1][0];
				if (fl && !sup[z] && siz[z] + 1 == dep[v1] - dep[u]) {
					if (Yyc(w1, w2)) {
						fl = 1;
						f[u] += Yyc(w1, w2);
					}
				}
			}
		} else {
			if (siz[u] > 2 && siz[u] % 2 == 0) f[u]++;
		}
	} else {
		sup[u] = u;
		int v1 = son[u][0], v2 = son[u][1];
		if (siz[v1] > siz[v2]) swap(v1, v2);
//		cerr << u << " with v1 " << v1 << " v2 " << v2 << "\n";
		if (!sup[v1] && (!sup[v2] || dep[sup[v2]] - dep[v2] > siz[v1])) {
			int w1 = find(v2, dep[u] + siz[v1] + 2); f[u] += w1 ? f[w1] : 1; 
//			cerr << u << " with w1 " << w1 << " " << " QwQ\n";
		}
		if (!sup[v1] && (!sup[v2] || dep[sup[v2]] - dep[v2] + 1 > siz[v1] - 1)) {
			int w2 = find(v2, dep[u] + siz[v1]); f[u] += w2 ? f[w2] : 1; 
//			cerr << u << " with w2 " << w2 << " " << " QwQ\n";
		}
	}
	f[u] %= mod;
}
signed main() {
//	freopen("F:\\data.in", "r", stdin);
	cin >> n;
	for (int i = 1; i < n; i++) {
		int u, v;
		cin >> u >> v;
		g[u].pb(v), g[v].pb(u);
	}
	dep[1] = 1; dp(1, 0);
	cout << f[1] << "\n";
//	for (int i = 1; i <= n; i++) {
//		cerr << "dp_" << i << ": " << f[i] <<" AwA\n";
//	}
}
2023/1/12 11:48
加载中...