Query on a tree 树链剖分 第一次写
2014-05-09 23:30
239 查看
#include <cstring> #include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <map> #include <cmath> #include <queue> #include <string> #include <set> #include <stack> using namespace std; #define ll long long #define eps 1e-8 #define pi acos(-1.0) #define inf 0x3f3f3f3f #define mod 1000000007 #define sqr(x) ((x)*(x)) #define lson (u<<1) #define rson (u<<1|1) #define N 10100 #define M 100100 int n; int h ,vv[M],nxt[M],ww[M],e; int sz ,son ,fa ,top ,dep ; int eid ,E,cost ; int re ; int ma[N<<2]; void add(int u,int v,int w) { vv[e] = v, ww[e] = w, nxt[e] = h[u], h[u] = e++; vv[e] = u, ww[e] = w, nxt[e] = h[v], h[v] = e++; } void dfs1(int u,int f,int d){ sz[u] = 1, fa[u] = f, dep[u] = d; son[u] = -1; for(int i=h[u];i+1;i=nxt[i]) { int v = vv[i]; if(v==f) continue; dfs1(v,u,d+1); if(son[u]==-1||sz[vv[son[u]]]<sz[v]) { son[u] = i; } sz[u] += sz[v]; } } void dfs2(int u,int f) { top[u] = u; if(f+1) { int fv = vv[f^1]; top[u] = ( son[fv]==f ? top[fv]:u ); re[u] = ++E; eid[f/2+1] = E; cost[E] = ww[f]; } if(son[u]+1){ dfs2(vv[son[u]],son[u]); } for(int i=h[u];i+1;i=nxt[i]){ int v = vv[i]; if(v==fa[u]||i==son[u]) continue; dfs2(v,i); } } void pushUp(int u){ ma[u] = max(ma[lson],ma[rson]); } void build(int u,int l,int r){ if(l>=r){ ma[u] = cost[l]; return; } int mid = (l+r)>>1; build(lson,l,mid); build(rson,mid+1,r); pushUp(u); } void update(int u,int l,int r,int pos,int val){ if(l>=r){ ma[u] = val; return; } int mid = (l+r)>>1; if(pos<=mid) update(lson,l,mid,pos,val); else update(rson,mid+1,r,pos,val); pushUp(u); } int query(int u,int L,int R,int l,int r){ if(l<=L&&R<=r){ return ma[u]; } if(l>R||r<L) return 0; int mid = (L+R)>>1; return max(query(lson,L,mid,l,r),query(rson,mid+1,R,l,r)); } int cal(int u,int v) { int ret = 0; int f1 = top[u],f2 = top[v]; while(f1!=f2){ if(dep[f1]<dep[f2]){ swap(f1,f2); swap(u,v); } ret = max(ret,query(1,1,E,re[f1],re[u])); u = fa[f1],f1 = top[u]; } if(u==v) return ret; if(dep[u]>dep[v]) swap(u,v); return max(ret,query(1,1,E,re[vv[son[u]]],re[v])); } int main() { char op[20]; int T,a,b,c; scanf("%d",&T); while(T--) { memset(h,-1,sizeof(h)); E = e = 0; scanf("%d",&n); for(int i=1;i<n;i++) scanf("%d%d%d",&a,&b,&c),add(a,b,c); dfs1(1,-1,1); dfs2(1,-1); build(1,1,E); while(~scanf("%s",op)) { if(strcmp(op,"DONE")==0) break; scanf("%d%d",&a,&b); if(strcmp(op,"CHANGE")==0){ update(1,1,E,eid[a],b); } else printf("%d\n",cal(a,b)); } } }
相关文章推荐
- 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:
- 20060619-Hue shifts near the L*=0 axis
- Kendo UI diagram 更改connnect线颜色,及shapes的属性值
- Kendo UI grid 表格数据更新
- Android 更新UI的两种方法——handler和runOnUiThread()
- 编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]
- ueditor单独调用图片上传
- ueditor单独调用图片上传
- 解决mysql启动时报The server quit without updating PID file 的错误
- 百度Ueditor多图片上传控件
- 百度Ueditor多图片上传控件
- Pat(Advanced Level)Practice--1017(Queueing at Bank)
- setuid和seteuid
- zoj 1648 Circuit Board
- request存值,下一个页面不能访问的解决方法之一
- Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom
- HDU4512完美队形I && HDU1423 Greatest Common Increasing Subsequence (LCIS)
- UCGUI窗体管理及消息处理机制分析
- (转)JS中innerHTML,innerText,value
- android Bluetooth程序设计