SPOJ QTREE Query on a tree (树链剖分)
来源:互联网 发布:linux cpu调为高性能 编辑:程序博客网 时间:2024/06/05 16:13
树链剖分裸题。。
#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 longint 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[N], nxt[M], vv[M], cost[M], e;int buttom[N];int dep[N], sz[N], son[N], fa[N], val[N];int tid[N], lab[N], tp[N], 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;}
0 0
- SPOJ QTREE(Query on a tree树链剖分)
- SPOJ QTREE Query on a tree --树链剖分
- [ SPOJ - QTREE]Query on a tree && 树链剖分
- SPOJ QTREE Query on a tree 树链剖分
- SPOJ QTREE Query on a tree 树链剖分
- 【树链剖分】[SPOJ-QTREE]Query on a tree
- SPOJ QTREE - Query on a tree 【树链剖分】
- SPOJ QTREE- Query on a tree (树链剖分)
- [spoj QTREE Query on a tree]树链剖分
- SPOJ QTREE Query on a tree(树链剖分)
- SPOJ 375 QTREE系列-Query on a tree (树链剖分)
- SPOJ QTREE Query on a tree (树链剖分)
- SPOJ QTREE - Query on a tree(树链剖分)
- SPOJ 题目 375 QTREE - Query on a tree(树链剖分)
- [SPOJ QTREE] Query on a tree (树链剖分)
- SPOJ QTREE Query on a tree(树链剖分+线段树)
- Spoj Query on a tree SPOJ - QTREE(树链剖分+线段树)
- SPOJ QTREE 375. Query on a tree
- Servlet3.0中使用注解配置Servlet
- Adapter
- 8天学通MongoDB——第三天 细说高级操作
- Android绘图Canvas、Paint类基本用法
- 线程池ThreadPoolEXecutor
- SPOJ QTREE Query on a tree (树链剖分)
- Hibernate中Criteria的完整用法
- 学习笔记:第八章—线程控制上篇
- Ubuntu 14.04 安装&&配置CUDA7.0
- CodeForces 507E Breaking Good(最短路)
- Android画图Path的使用
- Java--传参的值传递和引用传递问题
- c++中的函数 和 c 函数的不同
- [Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法