赛时代码洛谷民间数据 95,小图灵只有 25,但是官方数据 AC 了。
不知道哪里写挂了,有没有好心人帮我看看。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+2;
int n,lim[N],u,v,l,r,x,a[N],b[N],c[N],d[N],w[N],son[N],fa[N];
vector<int>g[N];
__int128 uuse(int i,int x){
int y=min(x,lim[i]);
return(__int128)(1+y)*y/2*c[i]+y*b[i]+max(0ll,x-lim[i]);
}
bool check(){
for(int i=1;i<=n;i++){
__int128 uuuu=uuse(i,x);
int l=0,r=x+1;
while(r-l>1){
int y=l+r>>1;
if(uuuu-uuse(i,y)>=a[i])l=y;
else r=y;
}
if(uuuu-uuse(i,l)<a[i])return 0;
w[i]=l;
d[i]=son[i];
}
priority_queue<pair<int,int>>q;
for(int i=1;i<=n;i++)if(!d[i])q.push({w[i],i});
for(int i=n;i;i--){
int u=q.top().second;
if(q.top().first+1<i)return 0;
q.pop();
if(!--d[fa[u]])q.push({w[fa[u]],fa[u]});
}
return 1;
}
void dfs(int u,int f){for(int v:g[u])if(v!=f)++son[u],fa[v]=u,dfs(v,u);}
signed main(){
//freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i]>>b[i]>>c[i];
for(int i=1;i<n;i++)cin>>u>>v,g[u].push_back(v);
dfs(1,0);
for(int i=1;i<=n;i++){
l=0,r=(int)1e9+1;
while(r-l>1){
x=l+r>>1;
if(b[i]+x*c[i]>1)l=x;
else r=x;
}
lim[i]=l;
}
l=n-1,r=1e9;
while(r-l>1){
x=l+r>>1;
if(check())r=x;
else l=x;
}
cout<<r;
}