HDU 3966 트 리 체인 분할
#pragma comment(linker,"/STACK:100000000,100000000")
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 50000 + 5;
int tp[MAXN], fa[MAXN], num[MAXN], son[MAXN], dep[MAXN];
int id[MAXN], cnt, tid[MAXN];
vector<int>lin[MAXN];
void dfs1(int u, int f, int deep)
{
num[u] = 1, fa[u] = f, son[u] = 0, dep[u] = deep;
for(int i = 0 ; i < (int)lin[u].size() ; i++){
int v = lin[u][i];
if(v == f) continue;
dfs1(v, u, deep + 1);
num[u] += num[v];
if(num[son[u]] < num[v]) son[u] = v;
}
}
void dfs2(int u, int f)
{
id[u] = ++cnt;
tid[cnt] = u;
tp[u] = f;
if(son[u]) dfs2(son[u], f);
for(int i = 0 ; i < (int)lin[u].size() ; i++){
int v = lin[u][i];
if(v == fa[u] || v == son[u]) continue;
dfs2(v, v);
}
}
struct Tree
{
int l, r, val;
int add;
}tree[MAXN * 4];
int val[MAXN];
void build(int l, int r, int o)
{
tree[o].l = l, tree[o].r = r, tree[o].add = 0, tree[o].val = 0;
if(l == r){
tree[o].val = val[tid[l]];
return;
}
int mid = (l + r) / 2;
if(mid >= l) build(l, mid, o * 2);
if(mid < r) build(mid + 1, r, o * 2 + 1);
}
void push_down(int o)
{
if(tree[o].add == 0) return;
tree[o * 2].add += tree[o].add;
tree[o * 2 + 1].add += tree[o].add;
tree[o].add = 0;
}
int query(int u, int o)
{
// printf("u = %d, o = %d
", u, o);
// printf("tree[o].l = %d, tree[o].r = %d
", tree[o].l, tree[o].r);
// system("pause");
if(tree[o].l == tree[o].r && tree[o].l == u){
return tree[o].add + tree[o].val;
}
int ans = 0;
push_down(o);
int mid = (tree[o].l + tree[o].r) / 2;
if(mid >= u) ans = query(u, o * 2);
else ans = query(u, o * 2 + 1);
return ans;
}
void update(int l, int r, int val, int o)
{
// if(tree[o].r < l || tree[o].l > r) return;
// printf("l = %d, r = %d, val = %d, tree[o].l = %d, tree[o].r = %d, o = %d
", l, r, val, tree[o].l, tree[o].r, o);
// system("pause");
if(tree[o].l >= l && tree[o].r <= r){
tree[o].add += val;
return;
}
push_down(o);
int mid = (tree[o].l + tree[o].r) / 2;
if(mid < l) update(l, r, val, o * 2 + 1);
else if(mid >= r) update(l, r, val, o * 2);
else{
update(l, r, val, o * 2);
update(l, r, val, o * 2 + 1);
}
}
void solve(int u, int v, int val)
{
int tp1 = tp[u], tp2 = tp[v];
while(tp1 != tp2){
if(dep[tp1] < dep[tp2]) swap(tp1, tp2), swap(u, v);
update(id[tp1], id[u], val, 1);
u = fa[tp1];
tp1 = tp[u];
}
if(dep[u] > dep[v]) swap(u, v);
update(id[u], id[v], val, 1);
}
char op[1000];
int main()
{
int n, m, q;
while(scanf("%d%d%d", &n, &m, &q) != EOF){
for(int i = 0 ; i <= n ; i++) lin[i].clear();
int u, v, w;
for(int i = 1 ; i <= n ; i++) scanf("%d", &val[i]);
for(int i = 0 ; i < m ; i++){
scanf("%d%d", &u, &v);
lin[u].push_back(v);
lin[v].push_back(u);
}
cnt = 0;
dfs1(1, 0, 1);
dfs2(1, 1);
build(1, n, 1);
while(q--){
scanf("%s", op);
if(op[0] == 'Q'){
scanf("%d", &u);
// printf("first = %d, second = %d
", query(id[u], 1), val[id[u]]);
printf("%d
", query(id[u], 1));
}
else{
scanf("%d%d%d", &u, &v, &w);
if(op[0] == 'D') solve(u, v, -w);
else solve(u, v, w);
}
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.