pkuscD2T1
  • 板块学术版
  • 楼主__ycx2010__
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/5/15 14:35
  • 上次更新2024/5/15 19:01:48
查看原帖
pkuscD2T1
819929
__ycx2010__楼主2024/5/15 14:35

O(n2log⁡nω)O(\frac{n^2 \log n}{\omega}),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;
}
2024/5/15 14:35
加载中...