95pts TLE 求助
查看原帖
95pts TLE 求助
363036
chlchl楼主2023/11/3 20:51
#include<bits/stdc++.h>
#define ll long long
using namespace std;

const ll N = 1e5 + 10;
ll n, a[N], b[N], c[N], lst[N], d[N], mn[N];
ll id, head[N << 1], to[N << 1], nxt[N << 1];

void add(ll u, ll v){
	to[++id] = v;
	nxt[id] = head[u], head[u] = id;
}

__int128 calc(ll id, ll s, ll t){
	__int128 len = t - s + 1;
	if(c[id] >= 0)
		return (__int128)(b[id] * len) + (__int128)c[id] * (s + t) * len / (__int128)2;
	ll limd = (1ll - b[id]) / c[id];
	if(t <= limd)
		return (__int128)(b[id] * len) + (__int128)c[id] * (s + t) * len / (__int128)2;
	if(s > limd)
		return (__int128)(t - s + 1);
	return (__int128)(b[id] * (limd - s + 1)) + (__int128)c[id] * (s + limd) * (limd - s + 1) / (__int128)2 + (__int128)(t - limd);
}

void dfs(ll u, ll fa){
	mn[u] = lst[u];
	for(int i=head[u];i;i=nxt[i]){
		ll v = to[i];
		if(v == fa)
			continue;
		dfs(v, u);
		mn[u] = min(mn[u], mn[v] - 1);
	}
}

bool bfs(ll s){
	bitset<N> vis;
	ll now = 0;
	priority_queue<pair<ll, int> > q;
	q.push(make_pair(0, s));
	while(!q.empty()){
		ll u = q.top().second;
		q.pop(), ++now;
		vis[u] = 1;
		if(now > mn[u])
			return 0;
		for(int i=head[u];i;i=nxt[i]){
			int v = to[i];
			if(!vis[v])
				q.push(make_pair(-mn[v], v));
		}
	}
	return 1;
}

bool check(ll x){
	for(int i=1;i<=n;i++){
		ll l = 1, r = x;
		lst[i] = -1;
		while(l <= r){
			ll mid = (l + r) >> 1;
			if(calc(i, mid, x) >= (__int128)a[i])
				lst[i] = mid, l = mid + 1;
			else
				r = mid - 1;
		}
		
		if(lst[i] == -1)
			return 0;
	}
	dfs(1, 1);
	return bfs(1);
}

ll read(){
	ll n = 0, f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-')
			f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9')	
		n = (n << 1) + (n << 3) + (ch ^ 48), ch = getchar();
	return n * f;
}

int main(){
	n = read();
	for(int i=1;i<=n;++i)
		a[i] = read(), b[i] = read(), c[i] = read();
	for(int i=1,u,v;i<n;++i){
		u = read(), v = read();
		add(u, v), add(v, u);
	}
	ll l = 0, r = 1e9, ans = 0;
	while(l <= r){
		ll mid = (l + r) >> 1;
		if(check(mid))
			ans = mid, r = mid - 1;
		else
			l = mid + 1; 
	}
	printf("%lld\n", ans);
	return 0;
}
2023/11/3 20:51
加载中...