O(ωn2logn),Sub5,6,7WA了,求调
#include <bits/stdc++.h>
using namespace std;
const int N = 50010, M = 1010, mod = 1e9;
const long long limit = 1ll << 62;
int n, f[N], g2[N], out[N][2];
struct W_bitset {
long long a[M + 10];
void ins(int x) {
a[x / 62] += 1ll << (x % 62);
} void clear() {
for (int i = 0; i < M + 10; i ++ ) a[i] = 0;
} void right() {
for (int i = 0; i < M; i ++ ) {
a[i] >>= 1;
if (a[i + 1] & 1) a[i] += 1ll << 61;
}
} void add(W_bitset B) {
for (int i = 0; i < M; i ++ ) {
a[i] += B.a[i];
if (a[i] >= limit) {
a[i + 1] ++ ;
a[i] -= limit;
}
}
}
} g[N];
struct Big {
int a[N], len;
void mul2() {
for (int i = len; i >= 1; i -- ) {
a[i] *= 2;
if (a[i] >= mod) {
a[i + 1] ++ ;
a[i] -= mod;
}
}
if (a[len + 1] > 0) len ++ ;
} void out() {
printf("%d", a[len]);
for (int i = len - 1; i >= 1; i -- ) printf("%09d", a[i]);
}
} A;
bool check(int mid) {
for (int i = 1; i <= n + 1; i ++ ) g[i].clear(), g2[i] = 0;
if (mid == 0) g2[1] ++ ;
else g[1].ins(mid);
for (int i = 1; i <= n; i ++ ) {
if (g2[i] & 1) return false;
g2[out[i][0]] += g2[i] / 2;
g2[out[i][1]] += g2[i] / 2;
if (g[i].a[0] & 2) {
g2[out[i][0]] ++ ;
g2[out[i][1]] ++ ;
g[i].a[0] ^= 2;
}
g[i].right();
g[out[i][0]].add(g[i]);
g[out[i][1]].add(g[i]);
}
return true;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d%d", &out[i][0], &out[i][1]);
for (int i = n; i >= 1; i -- ) f[i] = max(f[out[i][0]], f[out[i][1]]) + 1;
int l = 0, r = f[1];
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
A.a[1] = 1, A.len = 1;
while (l -- ) {
A.mul2();
}
A.out();
return 0;
}