RT,谢谢。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define LL __int128_t
#define ld long double
const int N = 100010, M = 200010;
int n;
LL m;
int hd[N], ed[M], nt[M], cnt = 1;
LL a[N], b[N], c[N], d[N], s[N];
void add_edge (int u, int v)
{
ed[++cnt] = v;
nt[cnt] = hd[u];
hd[u] = cnt;
}
LL solve (LL a, LL b, LL c)
{
LL x;
if (c == 0)
x = (ld) m + 1 - ((ld) a / b);
else if (c > 0 || (c < 0 && b + m * c >= 1))
{
LL X = 2 * m * b + 2 * b - 2 * a + m * m * c + m * c;
x = ((c - 2 * b) + sqrt ((ld) (2 * b - c) * (2 * b - c) + (ld) 4 * c * X)) / (ld) (2 * c);
}
else
{
LL y = (ld) (1 - b) / c;
if (m - y >= a)
x = m + 1 - a;
else
{
LL X = 2 * y * b + 2 * b - 2 * (a + y - m) + y * y * c + y * c;
x = ((c - 2 * b) + sqrt ((ld) (2 * b - c) * (2 * b - c) + (ld) 4 * c * X)) / (ld) (2 * c);
}
}
return x;
}
void dfs (int u, int ft)
{
s[u] = 1000000000;
for (int i = hd[u]; i; i = nt[i])
{
int v = ed[i];
if (v == ft)
continue;
dfs (v, u);
s[u] = min (s[u], s[v] - 1);
}
s[u] = min (s[u], d[u]);
}
bool check()
{
for (int i = 1; i <= n; i++)
d[i] = solve (a[i], b[i], c[i]);
dfs (1, 0);
return s[1] >= 1;
}
LL BSch()
{
LL l = n, r = 1000000000, ans = -1;
while (l <= r)
{
m = l + r >> 1;
if (check())
{
ans = m;
r = m - 1;
}
else
l = m + 1;
}
return ans;
}
int main()
{
scanf ("%d", &n);
for (int i = 1; i <= n; i++)
{
ll x, y, z;
scanf ("%lld%lld%lld", &x, &y, &z);
a[i] = x;
b[i] = y;
c[i] = z;
}
for (int i = 1; i < n; i++)
{
int u, v;
scanf ("%d%d", &u, &v);
add_edge (u, v);
add_edge (v, u);
}
printf ("%lld\n", (ll) BSch());
return 0;
}
/*
a: b c
c=0:
(m-x+1)b>=a
mb-xb+b>=a
xb<=mb+b-a
x<=(mb+b-a)/b
x<=m+1-(a/b)
c>0:
2(m-x+1)b+c(x+m)(m-x+1)>=2a
2mb-2xb+2b+c(xm-xx+x+mm-xm+m)>=2a
-2xb+c(-xx+x+mm+m)>=2a-2mb-2b
-2xb-xxc+xc+mmc+mc>=2a-2mb-2b
2xb+xxc-xc<=2mb+2b-2a+mmc+mc
cxx+(2b-c)x<=X=2mb+2b-2a+mmc+mc
cxx+(2b-c)x-X<=0
x1<=x<=x2
c<0:
mc+b>=1 -> c>0
mc+b<1:
find max{y} s.t. yc+b>=1
yc>=1-b
y<=(1-b)/c
day[x,y]>=1 [y+1,m]<1->1
2(y-x+1)b+c(x+y)(y-x+1)>=2a+2y-2m
2yb-2xb+2b+c(xy-xx+x+yy-xy+y)>=2a+y-m
-2xb-cxx+cx+cyy+cy>=2a+y-m-2yb-2b
cxx+2xb-cx<=m-y-2a+2yb+2b+cyy+cy
x1<=x<=x2
m-x+1>=a
x<=m+1-a
*/