您的位置:首页 > Web前端

树链剖分(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

代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: