父子情深
思路
可将数轴上求前缀和的思路变换一下,转成在有根树上从根结点向叶结点求树上前缀和。
时间复杂度
Code
/**
* struct Point {
* int x;
* int y;
* };
*/
class Solution {
private:
#define maxn 100010
vector<int> g[maxn];
vector<long> val;
public:
/**
* 从 1 到 n 每个结点的权值。
* @param n int整型
* @param Edge Point类vector (u, v) 集合
* @param q int整型
* @param Query Point类vector Point.x 为题中 r, Point.y题中 为 x
* @return long长整型vector
*/
void dfs(int x, int fa = 0) {
val[x] += val[fa];
for (auto v: g[x]) {
if (v == fa) continue;
dfs(v, x);
}
}
vector<long> solve(int n, vector<Point>& Edge, int q, vector<Point>& Query) {
// write code here
val.resize(n + 1);
for (int i = 1; i <= n; ++i) {
g[i].clear();
val[i] = 0;
}
for (auto cur: Edge) {
g[cur.x].push_back(cur.y);
g[cur.y].push_back(cur.x);
}
for (int i = 0; i < q; ++i) {
val[Query[i].x] += Query[i].y;
}
dfs(1);
return {val.begin() + 1, val.end()};
}
};
查看16道真题和解析