UESTC summer training A 【树链剖分 模板】
2016-08-24 19:59
375 查看
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; void read(int& x) { x = 0; char c = getchar(); int flag = 1; while(c<'0'||c>'9') { c = getchar(); if(c=='-')flag = -1; } while(c>='0'&&c<='9') { x = x*10+c-'0'; c = getchar(); } x*=flag; } #define maxn 100010 int n,q; int nowedge = 1; struct edge{ int v,next; }e[maxn<<1]; int head[maxn]; void adde(int u,int v) { e[nowedge].v = v; e[nowedge].next = head[u]; head[u] = nowedge++; } ll w[maxn]; int son[maxn]; int fa[maxn]; int top[maxn]; int tid[maxn],tim; int dep[maxn]; int rank[maxn]; int size[maxn]; void dfs1(int u,int father,int d) { dep[u] = d; size[u] = 1; fa[u] = father; for(int i=head[u];~i;i=e[i].next) { int v = e[i].v; if(v!=father) { dfs1(v,u,d+1); size[u]+=size[v]; if(son[u]==-1||size[son[u]]<size[v]) son[u] = v; } } } void dfs2(int u,int tp) { top[u] = tp; tid[u] = ++tim; rank[tid[u]] = u; if(son[u]==-1)return; dfs2(son[u],tp); for(int i=head[u];~i;i=e[i].next) { int v = e[i].v; if(v!=son[u]&&v!=fa[u]) dfs2(v,v); } } struct SegmentTree{ ll maxv; SegmentTree(){maxv = 0;} }tr[maxn<<4]; void pushup(int u){tr[u].maxv=max(tr[u<<1].maxv,tr[u<<1|1].maxv);} void update(int u,int l,int r,int x,int add) { if(l==r) { tr[u].maxv+=add; return; } int mid = (l+r)>>1; if(x<=mid)update(u<<1,l,mid,x,add); else update(u<<1|1,mid+1,r,x,add); pushup(u); } ll query(int u,int l,int r,int x,int y) { if(x<=l&&r<=y)return tr[u].maxv; int mid = (l+r)>>1; /* if(y<=mid)return query(u<<1,l,mid,x,y); else if(x>mid)return query(u<<1|1,mid+1,r,x,y); else { return max(query(u<<1,l,mid,x,mid),query(u<<1,mid+1,r,mid+1,y)); }*/ ll ret = -1e16; if(x<=mid)ret = max(ret,query(u<<1,l,mid,x,y)); if(y>mid)ret = max(ret,query(u<<1|1,mid+1,r,x,y)); return ret; } int Query(int x,int y) { int fx = top[x],fy = top[y]; ll ans = -1e16; while(fx!=fy) { if(dep[fx]<dep[fy]) { swap(fx,fy); swap(x,y); } ans = max(ans,query(1,1,n,tid[fx],tid[x])); x = fa[fx]; fx = top[x]; } ans = max(ans,(dep[x]>dep[y])?query(1,1,n,tid[y],tid[x]):query(1,1,n,tid[x],tid[y])); return ans; } int main() { #define LOC #ifdef LOC freopen("A.in","r",stdin); freopen("A.out","w",stdout); #endif read(n); memset(head,-1,sizeof(head)); memset(son,-1,sizeof(son)); int x,y; for(int i=1;i<n;i++) { read(x),read(y); adde(x,y); adde(y,x); } dfs1(1,0,1); dfs2(1,1); read(q); char op[2]; for(int i=1;i<=q;i++) { scanf("%s",op); read(x),read(y); if(op[0]=='I') { update(1,1,n,tid[x],y); w[x]+=y; } else printf("%d\n",Query(x,y)); } // while(1); return 0; }
相关文章推荐
- UESTC Summer Training #25解题报告
- UESTC 2016 Summer Training #18 Div.2(未完待续)
- 2016 UESTC ACM Summer Training Team Selection (2)解题报告
- UESTC Summer Team Training #2
- UESTC 2014 Summer Training #18 Div.2
- CDOJ1590-dfs+树链剖分(2017 UESTC Training for Data Structures O)
- UESTC 2014 Summer Training #19
- UESTC_Big Brother 2015 UESTC Training for Graph Theory<Problem G>
- Tri_integral Summer Training 6
- 2014 UESTC Training for Search Algorithm J
- 2014 UESTC Training for Graph Theory J
- 树链剖分线段更新模板fzu2082过路费
- 2017ecjtu-summer training # 11 POJ 2492
- Tutorials for 2014 SWJTU ACM Summer Training for Freshman
- 2015 UESTC Training for Dynamic Programming N - 导弹拦截 LIS nlog(n)+打印字典序最小的路径
- 【BNU Summer Training 2014.07.25】 Final Exam Arrangement (贪心)
- 【SPOJ QTREE】树链剖分模板
- 【整合】树链剖分模板(线段树维护)
- CSU 1607: Do You Have The Template?(基于边权的树链剖分的完善模板)
- 树链剖分详解及模板