#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &x)
{
static int c,p;
c = getchar(),p = 1,x = 0;
while(c < 48||c > 57)
{
if(c == 45) p = -1;
c = getchar();
}
while(48 <= c&&c <= 57)
{
x = (x<<3)+(x<<1)+(c^48);
c = getchar();
}
x *= p;
}
template<typename T>inline void write(T x)
{
static int c[40],len = 0;
if(x < 0) putchar(45),x = -x;
if(!x) putchar(48);
while(x)
{
c[++len] = (x%10)^48;
x /= 10;
}
while(len) putchar(c[len--]);
}
#define F(i,a,b) for(register int i = a;i <= b;++i)
#define D(i,a,b) for(register int i = a;i >= b;--i)
#define ull unsigned long long
#define ll long long
#define pii pair<int,int>
#define fi first
#define se second
#define N 100010
constexpr __uint128_t I = 1;
int head[N],nxt[N<<1],to[N<<1],cnt = 0;
inline void add(int u,int v)
{
nxt[++cnt] = head[u];
head[u] = cnt;
to[cnt] = v;
}
int n,d[N],s[N],f[N],dep[N],arr[N],m = 0,top;
ll a[N],b[N],c[N],B,C,lim;
void dfs(int u,int fa)
{
dep[u] = dep[fa] + 1,f[u] = fa;
for(register int i = head[u];i;i = nxt[i])
{
int v = to[i];
if(v == fa) continue;
dfs(v,u);
}
arr[++m] = u;
}
inline bool fun(int x)
{
if(C*top+B >= 1) return B*(top-x+1) + I*C*(x+top)*(top-x+1)/2 >= lim;
if(C*x+B >= 1)
{
int t = (B-1)/(-C);
return B*(t-x+1) + I*C*(x+t)*(t-x+1)/2+(top-t) >= lim;
}
return top-x+1 >= lim;
}
bool check(int x)
{
F(i,1,n)
{
if(!c[i])
{
d[i] = x - (a[i] - 1) / b[i];
d[i] = min(d[i],n);
if(d[i] < dep[i]) return 0;
continue;
}
top = x,B = b[i],C = c[i],lim = a[i];
if(!fun(dep[i])) return 0;
if(fun(n))
{
d[i] = n;
continue;
}
int l = dep[i],r = n,mid;
while(l <= r)
{
mid = (l + r) >> 1;
if(fun(mid)) l = mid + 1;
else r = mid - 1;
}
d[i] = r;
}
F(i,1,n)
if(f[arr[i]])
d[f[arr[i]]] = min(d[f[arr[i]]],d[arr[i]] - 1);
if(d[1] < 1) return 0;
memset(s,0,(n+5)<<2);
F(i,1,n) ++s[d[i]];
F(i,1,n)
{
s[i] += s[i-1];
if(s[i] > i) return 0;
}
return 1;
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
read(n);
F(i,1,n) read(a[i]),read(b[i]),read(c[i]);
F(i,1,n-1)
{
int u,v;
read(u),read(v);
add(u,v);
add(v,u);
}
dfs(1,0);
int l = n,r = 1e9,mid;
while(l <= r)
{
mid = (l + r) >> 1;
if(check(mid)) r = mid - 1;
else l = mid + 1;
}
write(l);
return 0;
}
CSP-S T4 洛谷 95 pts。有一个点浮点异常。
找到问题悬关。