hdu 4010
来源:互联网 发布:历年gdp三大产业数据 编辑:程序博客网 时间:2024/05/17 05:14
#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>template<class Num>void write(Num x){ if(x == 0) {putchar('0');return;} static char s[20]; int sl = 0; if(x < 0) x = -x, putchar('-'); while(x) s[sl++] = x % 10 + '0', x /= 10; while(sl) putchar(s[--sl]);}template<class Num>void read(Num &x){ char c; int flag = 1; while((c = getchar()) < '0' || c > '9') if(c == '-') flag *= -1; x = c - '0'; while((c = getchar()) >= '0' && c <= '9') x *= 10, x += c - '0'; x *= flag;}const int maxn = 3e5 + 20;int n, q;int fa[maxn], c[maxn][2];int add[maxn], rev[maxn], w[maxn], max[maxn];bool isroot(int x){ return c[fa[x]][0] != x && c[fa[x]][1] != x;}void pushdown(int x){ if(rev[x]) { std::swap(c[x][0], c[x][1]); if(c[x][0]) rev[c[x][0]] ^= 1; if(c[x][1]) rev[c[x][1]] ^= 1; rev[x] = 0; } if(add[x]) { if(c[x][0]) { w[c[x][0]] += add[x]; max[c[x][0]] += add[x]; add[c[x][0]] += add[x]; } if(c[x][1]) { w[c[x][1]] += add[x]; max[c[x][1]] += add[x]; add[c[x][1]] += add[x]; } add[x] = 0; }}void update(int x){ max[x] = w[x]; if(c[x][0]) max[x] = std::max(max[c[x][0]], max[x]); if(c[x][1]) max[x] = std::max(max[c[x][1]], max[x]);}void setc(int x,int i,int y){ c[x][i] = x ? y : 0, fa[y] = y ? x : 0;}void rotate(int x){ int y = fa[x]; pushdown(y), pushdown(x); int t = c[y][1] == x; fa[x] = fa[y]; if(!isroot(y)) setc(fa[y], c[fa[y]][1] == y, x); setc(y, t, c[x][t ^ 1]), setc(x, t ^ 1, y); update(y), update(x);}void spaly(int u){ pushdown(u); while(!isroot(u)) rotate(u);}void access(int u){ int o = u, v = 0; while(u) { spaly(u), c[u][1] = v, update(u); v = u, u = fa[u]; } spaly(o);}int getroot(int u){ access(u); while(c[u][0]) { u = c[u][0]; pushdown(u); } return u;}void makeroot(int u){ access(u), rev[u] ^= 1;}void link(int u,int v){ makeroot(u), fa[u] = v;}void cut(int u,int v){ makeroot(u), access(v); fa[c[v][0]] = fa[v]; fa[v] = c[v][0] = 0; update(v);}/*void cut(int u,int v){ makeroot(u), fa[u] = v;}*/void solve(){ int v, x, y; read(q); while(q--) { read(v); if(v == 1) { read(x), read(y); if(getroot(x) != getroot(y)) link(x, y); else puts("-1"); } if(v == 2) { read(x), read(y); if(x != y && getroot(x) == getroot(y)) cut(x, y); else puts("-1"); } if(v == 4) { read(x), read(y); if(getroot(x) == getroot(y)) { makeroot(y), access(x); write(max[x]), puts(""); } else puts("-1"); } if(v == 3) { read(v), read(x), read(y); if(getroot(x) == getroot(y)) { makeroot(y), access(x); max[x] += v, w[x] += v, add[x] += v; } else puts("-1"); } } puts("");}bool init(){ static int ex[maxn], ey[maxn]; if(scanf("%d", &n) == EOF) return false; for(int i = 1; i <= n; i++) { fa[i] = c[i][0] = c[i][1] = 0; rev[i] = add[i] = 0; } for(int i = 1, x, y; i < n; i++) read(ex[i]), read(ey[i]); for(int i = 1; i <= n; i++) read(w[i]), max[i] = w[i]; for(int i = 1; i < n; i++) link(ex[i], ey[i]); return true;}int main(){#ifndef ONLINE_JUDGE freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);#endif while(init()) solve();#ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout);#endif return 0;}
0 0
- HDU 4010
- hdu 4010
- hdu 4010
- hdu 4010(LinkCutTree)
- HDU 4010 LCT
- hdu 4010 LCT
- hdu 4004 4006 4010
- hdu 4010 LCT
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- Activity四种启动模式
- java数组
- 求图形面积,重心 HDU Lifting the Stone 1115
- TCP协议中的三次握手和四次挥手
- Ubuntu 下 sublime text 3 java环境的编译
- hdu 4010
- ubuntu can't start up--fix grub using ubuntu live cd
- 动态规划-最长公共子序列
- python socket网络编程
- SqlServer中decimal(numeric )、float 和 real 数据类型的区别
- [leetcode]Find Peak Element
- java函数重载
- android网络编程 一(HttpURLConnection)
- Linux内核构建系统之七