HDU5692 Snacks (dfs序 + 線段樹)
阿新 • • 發佈:2019-01-30
#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <vector> #include <algorithm> #include <utility> #include <string.h> #include <stdio.h> using namespace std; const int maxn = 100030; const long long INF = 0x3f3f3f3f3f3f3f; int in[maxn], out[maxn], value[maxn], t[maxn],dfs_clock; long long dist[maxn]; struct Node { int u, v, next; }node[maxn << 1]; int num, head[maxn]; int a[maxn]; void init() { num = 0; dfs_clock = 0; memset(head, -1, sizeof(head)); } void add(int u, int v) { node[num] = {u, v, head[u]}; head[u] = num++; node[num] = {v, u, head[v]}; head[v] = num++; } void dfs(int u, int fa) { in[u] = ++dfs_clock; t[dfs_clock] = u; for (int i = head[u]; i != -1; i = node[i].next) { int v = node[i].v; if (v != fa) { dist[v] = dist[u] + a[v]; dfs(v, u); } } out[u] = dfs_clock; } long long tree[maxn << 2], lazy[maxn << 2]; void push_up(int node) { tree[node] = max(tree[node << 1], tree[node << 1 | 1]); } void push_down(int node) { if (lazy[node]) { tree[node << 1] += lazy[node]; tree[node << 1 | 1] += lazy[node]; lazy[node << 1] += lazy[node]; lazy[node << 1 | 1] += lazy[node]; lazy[node] = 0; } } void build(int node, int left, int right) { lazy[node] = 0; if (left == right) { tree[node] = dist[t[left]]; return; } int mid = (left + right) >> 1; build(node << 1 , left, mid); build(node << 1 | 1, mid + 1, right); push_up(node); } void update(int node, int left, int right, int begin, int end, int val) { if (begin <= left && end >= right) { lazy[node] += val; tree[node] += val; return; } push_down(node); int mid = (left + right) >> 1; if (mid >= begin) update(node << 1, left, mid, begin, end, val); if (mid < end) update(node << 1 | 1, mid + 1, right, begin, end, val); push_up(node); } long long query(int node, int left, int right, int begin, int end) { if (begin <= left && end >= right) { return tree[node]; } push_down(node); long long ans = -INF; int mid = (left + right) >> 1; if (mid >= begin) ans = max(ans, query(node << 1, left, mid, begin, end)); if (mid < end) ans = max(ans, query(node << 1 | 1, mid + 1, right, begin, end)); return ans; } int main() { //freopen("in.txt", "r", stdin); ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; for (int i = 1; i<= t; ++i) { init(); cout << "Case #" << i << ":\n"; int n, m; cin >> n >> m; for (int j = 1; j < n; ++j) { int u, v; cin >> u >> v; add(u, v); } for (int j = 0; j < n; ++j) { cin >> a[j]; } dist[0] = a[0]; dfs(0, -1); build(1, 1, n); for (int j = 0; j < m; ++j) { int state; cin >> state; if (state == 1) { int q; cin >> q; cout << query(1, 1, n, in[q], out[q]) << endl; } else { int num, val; cin >> num >> val; update(1, 1, n, in[num], out[num], val - a[num]); a[num] = val; } } } }