您的位置:首页 > 产品设计 > UI/UE

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));
}

}

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