SPOJ QTREE Query on a tree (树链剖分)
2015-08-03 23:13
435 查看
树链剖分裸题。。
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #include<set> #include<algorithm> using namespace std; #define LL long long #define eps 1e-8 #define MP make_pair #define N 200020 #define M 400020 #define NLGN 400002 #pragma comment(linker, "/STACK:1024000000,1024000000") #define ls (i << 1) #define rs (ls | 1) #define md ((ll + rr) >> 1) #define lson ll, md, ls #define rson md + 1, rr, rs #define mod 258280327 #define inf 0x3f3f3f3f #define pii pair<int, int> #define ULL unsigned long long int readint() { char c; while((c = getchar()) && !(c >= '0' && c <= '9') && c != '-'); int ret = c - '0', sgn = 0; if(c == '-') sgn = 1, ret = 0; while((c = getchar()) && c >= '0' && c <= '9') ret = ret * 10 + c - '0'; if(sgn) ret = -ret; return ret; } char buf[8000000],*pt = buf,*o = buf; int getint(){ int f = 1,x = 0; while((*pt != '-') && (*pt < '0' || *pt > '9')) pt ++; if(*pt == '-') f = -1,pt ++; else x = *pt++ - 48; while(*pt >= '0' && *pt <= '9') x = x * 10 + *pt ++ - 48; return x * f; } char getch(){ char ch; while(*pt < 'A' || *pt > 'Z') pt ++; ch=*pt;pt++; return ch; } int n; int fst , nxt[M], vv[M], cost[M], e; int buttom ; int dep , sz , son , fa , val ; int tid , lab , tp , dc; int mx[N<<2]; void init() { memset(fst, -1, sizeof fst); e = 0; } void add(int u, int v, int c) { vv[e] = v, cost[e] = c, nxt[e] = fst[u], fst[u] = e++; } void dfs(int u, int p, int d) { fa[u] = p, sz[u] = 1; dep[u] = d, son[u] = 0; int mx = 0; for(int i = fst[u]; ~i; i = nxt[i]) { int v = vv[i]; if(v == p) continue; buttom[i/2+1] = v; val[v] = cost[i]; dfs(v, u, d + 1); sz[u] += sz[v]; if(mx < sz[v]) mx = sz[v], son[u] = v; } } void dfs1(int u, int anc) { tid[u] = ++dc; lab[dc] = u; tp[u] = anc; if(son[u]) dfs1(son[u], anc); for(int i = fst[u]; ~i; i = nxt[i]) { int v = vv[i]; if(v == fa[u] || son[u] == v) continue; dfs1(v, v); } } void build(int ll, int rr, int i) { if(ll == rr) { mx[i] = val[lab[ll]]; return; } build(lson); build(rson); mx[i] = max(mx[ls], mx[rs]); } int query(int l, int r, int ll, int rr, int i) { if(ll == l && rr == r) return mx[i]; if(r <= md) return query(l, r, lson); if(l > md) return query(l, r, rson); return max(query(l, md, lson), query(md + 1, r, rson)); } void update(int x, int v, int ll, int rr, int i) { if(ll == rr) { mx[i] = v; return; } if(x <= md) update(x, v, lson); else update(x, v, rson); mx[i] = max(mx[ls], mx[rs]); } int f(int u, int v) { int ret = -inf; while(tp[u] != tp[v]) { if(dep[tp[u]] > dep[tp[v]]) swap(u, v); ret = max(ret, query(tid[tp[v]], tid[v], 1, n, 1)); v = fa[tp[v]]; } if(dep[u] > dep[v]) swap(u, v); if(u != v) ret = max(ret, query(tid[u] + 1, tid[v], 1, n, 1)); return ret; } int main() { int cas; scanf("%d", &cas); while(cas--) { scanf("%d", &n); init(); for(int i = 1; i < n; ++i) { int u, v, c; scanf("%d%d%d", &u, &v, &c); add(u, v, c); add(v, u, c); } dfs(1, -1, 0); dc = 0; dfs1(1, 1); build(1, n, 1); char op[10]; while(scanf("%s", op) && op[0] != 'D') { int x, y; scanf("%d%d", &x, &y); if(op[0] == 'Q') { printf("%d\n", f(x, y)); } else { update(tid[buttom[x]], y, 1, n, 1); } } } return 0; }
相关文章推荐
- UIScrollView上面添加的uiftextfield如何失去第一响应者
- UITableView Cell
- UE4信息交互-蓝图类中的信息交互
- UI 03 关于UITextField键盘遮挡问题
- FZU 1752 Quickmod Quickmulti
- Android UI: LinearLayout中layout_weight 属性的使用规则
- Xcode6以后segue取消原push与modal(deprecated)
- UI 03 UIButton 和 UITextField
- UITextField总结
- Unknown Class XX in Interface Builder File
- UIRectEdge
- UICntrol
- [leetcode-60]Permutation Sequence(C)
- hdu 4893 Wow! Such Sequence! (线段树 区间更新+单点更新)
- POJ2785 4 Values whose Sum is 0
- UISwitch
- [2015hdu多校联赛补题]hdu5297 Y sequence
- hdoj 1005 Number Sequence
- zoj2587 Unique Attack 判断最小割是否唯一
- Havok_2014-1-0_Pc_Xs_User_Guide(1.1.1-简介)