树链剖分(Housewife Wind,POJ 2763)
2016-11-23 20:42
441 查看
模板:http://blog.csdn.net/acdreamers/article/details/10591443
详解:http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html
树链剖分题目汇总:http://blog.csdn.net/r_clover/article/details/50782400
代码
详解:http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html
树链剖分题目汇总:http://blog.csdn.net/r_clover/article/details/50782400
代码
#include<cstdio> #define maxn 100010 #define ls (now<<1) #define rs (now<<1|1) using namespace std; int n,q,s; ////////////////// //edge struct Edge { int to,val,next; }edges[maxn<<1]; int head[maxn],tot; void init(int n) { tot=0; for(int i=0;i<=n;i++) head[i]=-1; } void add(int from,int to,int val) { edges[tot].to=to; edges[tot].val=val; edges[tot].next=head[from]; head[from]=tot++; } ////////////////////////////// ////////////////////////////// //Ê÷Á´ÆÊ·Ö int dep[maxn],fa[maxn],son[maxn],siz[maxn]; int tim,tid[maxn],rank[maxn],top[maxn]; void dfs1(int u,int f,int d) { dep[u]=d; fa[u]=f; siz[u]=1; son[u]=-1; for(int i=head[u];~i;i=edges[i].next) { int v=edges[i].to; if(v==f) continue; dfs1(v,u,d+1); siz[u]+=siz[v]; if(son[u]==-1||siz[v]>siz[son[u]]) 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=edges[i].next) { int v=edges[i].to; if(v==fa[u]) continue; if(v==son[u]) continue; dfs2(v,v); } } ///////////////////////////// ///////////////////////////// //Ï߶ÎÊ÷ int tree[maxn<<2]; inline void up_data(int now) { tree[now]=tree[ls]+tree[rs]; } void A(int l,int r,int now,int pos,int val) { if(l==r) { tree[now]=val; return; } int m=(l+r)>>1; if(pos<=m) A(l,m,ls,pos,val); else A(m+1,r,rs,pos,val); up_data(now); } int Q(int l,int r,int now,int ql,int qr) { if(ql<=l&&r<=qr) return tree[now]; int ansl=0,ansr=0; int m=(l+r)>>1; if(qr>m) ansr=Q(m+1,r,rs,ql,qr); if(ql<=m) ansl=Q(l,m,ls,ql,qr); return ansl+ansr; } void AA(int i,int v) { if(fa[edges[i*2-1].to]==edges[i*2-2].to) A(1,n,1,tid[edges[i*2-1].to]-1,v); else A(1,n,1,tid[edges[i*2-2].to]-1,v); } int QQ(int x,int y) { int ret=0; int tpx=top[x]; int tpy=top[y]; while(x!=y) { if(tpx!=tpy) { if(dep[tpx]>dep[tpy]) { ret+=Q(1,n,1,tid[tpx]-1,tid[x]-1); x=fa[tpx]; tpx=top[x]; } else { ret+=Q(1,n,1,tid[tpy]-1,tid[y]-1); y=fa[tpy]; tpy=top[y]; } } 4000 else { if(dep[x]>dep[y]) ret+=Q(1,n,1,tid[y],tid[x]-1); else ret+=Q(1,n,1,tid[x],tid[y]-1); return ret; } } return ret; } void INIT(int n) { init(n); tim=0; for(int i=0;i<=(n<<2);i++) tree[i]=0; } int main() { int a,b,w; while(scanf("%d %d %d",&n,&q,&s)==3) { INIT(n); for(int i=1;i<n;i++) { scanf("%d %d %d",&a,&b,&w); add(a,b,w); add(b,a,w); } dfs1(1,-1,1); dfs2(1,1); for(int i=0;i<tot;i+=2) AA(i/2+1,edges[i].val); int op,u,i,w; while(q--) { scanf("%d",&op); if(op) { scanf("%d %d",&i,&w); AA(i,w); } else { scanf("%d",&u); printf("%d\n",QQ(s,u)); s=u; } } } return 0; }
相关文章推荐
- POJ 2763 Housewife Wind (树链剖分)
- POJ 2763 Housewife Wind 树链剖分
- POJ 2763 Housewife Wind(树链剖分(边权))
- POJ - 2763_Housewife Wind_树链剖分
- POJ 2763 Housewife Wind [树链剖分(边权)+树状数组]【数据结构】
- POJ 2763 Housewife Wind(树链剖分)
- POJ 2763 Housewife Wind (树链剖分)
- 【树链剖分】 POJ 2763 Housewife Wind 边权
- POJ 2763 Housewife Wind(树链剖分+BIT)
- POJ 2763 Housewife Wind 树链剖分 边权
- poj 2763 Housewife Wind(树链剖分)
- POJ-2763 Housewife Wind(树链剖分)
- POJ 2763 Housewife Wind(树链剖分+树状数组)
- poj 2763 Housewife Wind(树链剖分,边权)
- POJ 2763 Housewife Wind 树链剖分
- poj 2763 Housewife Wind 树链剖分
- poj 2763 Housewife Wind 【树链剖分维护树上权值和】
- POJ 2763 Housewife Wind(树链剖分)(线段树单点修改)
- POJ 2763 -- Housewife Wind 树链剖分 LCT 动态树
- poj2763 Housewife Wind【树链剖分+线段树】