所以线段树似乎卡过了

GIAOchen 2023-11-27 12:34:13 2023-11-27 12:35:42 6 返回题目

Code:

#include<bits/stdc++.h>
#define LL long long
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define Fcin \
	ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const int N = 1e6 + 10;
int n, Q, dfn[N], sz[N], R[N], A[N];
LL B[N];
vector<int> G[N];
int tot = 0;
void DFS(LL x, LL fa){
	dfn[x] = ++ tot;
	for (int it : G[x]){
		if (it != fa){
			DFS(it, x);
			sz[x] += sz[it];
		}
	}
	sz[x] ++;
	R[x] = dfn[x] + sz[x] - 1;
	return ;
}

LL tree[(int)(2.5 * N)];
void pushup(LL p) { tree[p] = tree[ls(p)] + tree[rs(p)]; }

void update(int p, int l, int r, int x, int k){
	if (l == r && l == x){ tree[p] += k; return ; }
	int mid = (l + r) >> 1;
	if (x <= mid)
		update(ls(p), l, mid, x, k);
	if (x >= mid + 1)
		update(rs(p), mid + 1, r, x, k);
	pushup(p);
	return ;
}

LL query(int p, int l, int r, int x, int y){
	if (x <= l && y >= r){ return tree[p]; }
	int mid = (l + r) >> 1; LL ret = 0;
	if (x <= mid)
		ret += query(ls(p), l, mid, x, y);
	if (y >= mid + 1)
		ret += query(rs(p), mid + 1, r, x, y);
	return ret;
}
int rt;
int main(){
	Fcin;
	cin >> n >> Q >> rt;
	for (int i = 1; i <= n; i ++)
		cin >> A[i];
	int u, v, opt;
	for (int i = 1; i < n; i ++) { cin >> u >> v; G[u].emplace_back(v); G[v].emplace_back(u); }
	DFS(rt, 0);
	for (int i = 1; i <= n; i ++){
		B[dfn[i]] = A[i];
	}
	for (int i = 1; i <= n; i ++){
		B[i] += B[i - 1];
	}
	while (Q --){
		cin >> opt >> u;
		if (opt == 1){ 
			cin >> v;
			update(1, 1, n, dfn[u], v);
		}
		else { cout << query(1, 1, n, dfn[u], R[u]) + B[R[u]] - B[dfn[u] - 1] << "\n"; }
	}
	return 0;
}

测试点时间: 17ms / 415ms / 1554ms / 2739ms / 2446ms

{{ vote && vote.total.up }}

共 1 条回复

chenyining

333