TLE 球条
查看原帖
TLE 球条
759710
LuoFeng_Nanami楼主2024/11/11 21:27

rt,sub 3 全部 TLE,不知道什么原因

//LuoFeng Nanami ver. 
#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i, a, b) for(rll i = a; i <= b; i++)
#define Fdn(i, a, b) for(rll i = a; i >= b; i--)
#define pii pair<int, int>
#define fi first
#define se second

using namespace std;

const int inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7, _mod = 998244353;
const int maxn = 2e5 + 7;

int n;
int siz[maxn];
vector<int> G[maxn];

inline void init(int u, int fa) {
	siz[u] = 1;
	for(int v : G[u]) {
		if(v == fa) continue ;
		init(v, u); siz[u] += siz[v];
	}
}

multiset<int> s1, s2; // s1 to root, s2 other

int ans = inf;

inline void solve(int u, int fa) {
	if(!s1.empty()) {
		auto p1 = lower_bound(s1.begin(), s1.end(), siz[u] + (n - siz[u]) / 2);
		if(p1 != s1.end()) {
			int a = siz[u], b = *p1 - siz[u], c = n - a - b;
			ans = min(ans, max(a, max(b, c)) - min(a, min(b, c)));
		} 
		if(p1 != s1.begin()) {
			p1--;
			int a = siz[u], b = *p1 - siz[u], c = n - a - b;
			ans = min(ans, max(a, max(b, c)) - min(a, min(b, c)));
		}
	}
	if(!s2.empty()) {
		auto p2 = lower_bound(s2.begin(), s2.end(), (n - siz[u]) / 2);
		if(p2 != s2.end()) {
			int a = siz[u], b = *p2, c = n - a - b;
			ans = min(ans, max(a, max(b, c)) - min(a, min(b, c)));
		} 
		if(p2 != s2.begin()) {
			p2--;
			int a = siz[u], b = *p2, c = n - a - b;
			ans = min(ans, max(a, max(b, c)) - min(a, min(b, c)));
		}		
	}
	if(u != 1) s1.insert(siz[u]);
	for(int v : G[u]) if(v != fa) solve(v, u);
	if(u != 1) s1.erase(s1.find(siz[u])), s2.insert(siz[u]);
}


signed main() {
//freopen("glz.in", "r", stdin);
//	freopen("glz.out", "w", stdout);
	
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	cin >> n;
	F(i, 1, n - 1) { 
		int u, v; cin >> u >> v;
		G[u].push_back(v), G[v].push_back(u);	
	}
	
	init(1, 0);
	solve(1, 0);
	
	cout << ans;

	return 0;
}
2024/11/11 21:27
加载中...