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

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