Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37878 | LYLAKIOI | 【BJ】T2 | C++ | 通过 | 100 | 5146 MS | 68736 KB | 2880 | 2025-05-23 14:13:36 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=2e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,a[maxn],d[maxn],k[maxn]; vector<int>E[maxn]; ll res[maxn]; struct BIT { ll t[maxn]; int lb(int x){return x&(-x);} void upd(int x,ll v){for(;x<=n;x+=lb(x))t[x]+=v;} ll ask(int x){ll res=0;for(;x;x-=lb(x))res+=t[x];return res;} }T; int siz[maxn],mxs[maxn],vis[maxn]; struct _ { ll s,lim; }f[maxn],g[maxn]; vector<int>nd[maxn]; void dfs(int u,int fa,int b){ nd[b].p_b(u); f[u].s=f[fa].s+d[u];f[u].lim=min(f[fa].lim,k[u]-f[fa].s); g[u].s=g[fa].s+d[u];g[u].lim=min(g[fa].lim-d[u],(ll)k[u]); for(int x:E[u])if(x!=fa&&(!vis[x]))dfs(x,u,b); } void dfs2(int u,int fa){ siz[u]=1,mxs[u]=0; for(int x:E[u])if(x!=fa&&(!vis[x]))dfs2(x,u),siz[u]+=siz[x],mxs[u]=max(mxs[u],siz[x]); } void calc(vector<int>upd,vector<int>qry,int sgn){ sort(upd.begin(),upd.end(),[](int x,int y){return f[x].lim>f[y].lim;}); sort(qry.begin(),qry.end(),[](int x,int y){return g[x].s>g[y].s;}); int j=0; for(int x:qry){ while(j<(int)upd.size()&&f[upd[j]].lim>=g[x].s)T.upd(a[upd[j]],a[upd[j]]),j++; res[x]+=sgn*(T.ask(n)-T.ask(a[x]-1)); } up(i,0,j-1)T.upd(a[upd[i]],-a[upd[i]]); } void dfs3(int u){ vis[u]=1;vector<int>son; for(int x:E[u])if(!vis[x])son.p_b(x); g[u].s=d[u],g[u].lim=k[u]; f[u].s=0,f[u].lim=1e9; for(int x:son)dfs(x,u,x); vector<int>qry={u},upd={u}; for(int x:son) for(int y:nd[x])if(g[y].lim>=0)qry.p_b(y); for(int x:son)for(int y:nd[x])upd.p_b(y); calc(upd,qry,1); for(int x:son){ vector<int>qry,upd; for(int y:nd[x])if(g[y].lim>=0)qry.p_b(y); for(int y:nd[x])upd.p_b(y); calc(upd,qry,-1); } vector<int>rt; for(int x:son){ dfs2(x,0); for(int p:nd[x])mxs[p]=max(mxs[p],siz[x]-siz[p]); int q=x;for(int p:nd[x])if(mxs[p]<mxs[q])q=p; rt.p_b(q); nd[x].clear();nd[x].shrink_to_fit(); } for(int x:rt)dfs3(x); } void slv(){ n=read();up(i,1,n)E[i].clear(),res[i]=vis[i]=0; up(i,1,n)a[i]=read(),d[i]=read(),k[i]=read(); up(i,1,n-1){ int x=read(),y=read(); E[x].p_b(y),E[y].p_b(x); }dfs3(1); up(i,1,n)printf("%lld ",res[i]);printf("\n"); } int main(){ //freopen("wicked.in","r",stdin),freopen("wicked.out","w",stdout); int c=read(),t=read();while(t--)slv(); return 0; }