题意:~
思路:
#include <bits/stdc++.h> using namespace std; typedef long long LL; template <class T> inline bool scan_d(T &ret) {char c; int sgn;if(c=getchar(),c==EOF) return 0;while(c!='-'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1;ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); ret*=sgn;return 1;} int n; const int N = 100050; struct mmp { int v, next; } edge[N]; int head[N], tot; void add(int u, int v) { edge[tot] = {v, head[u]}; head[u] = tot++; } LL val[N]; LL ans[N], sum[N]; int lev[N]; void init() { memset(head, -1, sizeof(head)); tot = 0; memset(ans, 0, sizeof(ans)); memset(sum, 0, sizeof(sum)); } void update(int x, LL val) { for(int i = x; i < N; i += i & (-i)) { sum[i] += val; } } LL query(int x) { LL res = 0; for(int i = x; i > 0; i -= i & (-i)) { res += sum[i]; } return res; } void dfs(int u) { LL pre = query(lev[u] - 1); update(lev[u], val[u]); for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; dfs(v); } ans[u] = query(lev[u] - 1) - pre; } int main() { while(~scanf("%d", &n)) { init(); int u, k, w; int rt = 0; for(int i = 1; i <= n; ++i) { scan_d(u), scan_d(k), scan_d(w); lev[i] = k; val[i] = w; if(u == -1) rt = i; else add(u, i); } dfs(rt); for(int i = 1; i <= n; ++i) printf("%lld\n", ans[i]); } return 0; }
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/1428 (转载时请注明本文出处及文章链接)
发表评论
快来吐槽一下吧!