题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966

题目大意:营地的分布成树型。每个营地都有一些人,每次修改修改一条链上的所有营地的人数,每次查询单个点。

解题思路

树链剖分基础题。

维护一个sum。

注意轻链修改时,点修改和边修改的不同。

由于树的结构与线段树点的顺序不太相同,因此需要做一个映射数组rank。故在线段树Build的时候,权值是camp[rank[l]],rank这步的映射在dfs2的时候完成,rank[w[u]]=u;

Query单点u的时候, w[u]是其在线段树中的位置。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include "cstdio"
#include "vector"
#include "cstring"
using namespace std;
#define maxn 50005
int camp[maxn],s[maxn],dep[maxn],pos[maxn],son[maxn],top[maxn],fa[maxn],w[maxn],rank[maxn],cnt,n;
vector<int> G[maxn];
void dfs1(int u,int pre,int d)
{
s[u]=;fa[u]=pre;dep[u]=d;
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(v==pre) continue;
dfs1(v,u,d+);
s[u]+=s[v];
if(son[u]!=-||s[v]>s[son[u]]) son[u]=v;
}
}
void dfs2(int u,int tp)
{
w[u]=++cnt;top[u]=tp;rank[w[u]]=u;
if(son[u]==-) return;
dfs2(son[u],tp);
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(v!=son[u]&&v!=fa[u])
dfs2(v,v);
}
}
//Segment-Tree
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
int col[maxn<<],sum[maxn<<];
void PushUp(int root)
{
sum[root]=sum[root<<]+sum[root<<|];
}
void Build(int l,int r,int root)
{
col[root]=;
if(l==r)
{
sum[root]=camp[rank[l]];
return;
}
int mid=(l+r)>>;
Build(lson);
Build(rson);
PushUp(root);
}
void PushDown(int root,int m)
{
if(col[root])
{
col[root<<]+=col[root];
col[root<<|]+=col[root];
sum[root<<]+=(m-(m>>))*col[root];
sum[root<<|]+=(m>>)*col[root];
col[root]=;
}
}
void Update(int L,int R,int v,int l,int r,int root)
{
if(L<=l&&r<=R)
{
col[root]+=v;
sum[root]+=(r-l+)*v;
return;
}
PushDown(root,r-l+);
int mid=(l+r)>>;
if(L<=mid) Update(L,R,v,lson);
if(R>mid) Update(L,R,v,rson);
PushUp(root);
}
int Query(int p,int l,int r,int root)
{
if(l==r) return sum[root];
PushDown(root,r-l+);
int mid=(l+r)>>,ret=;
if(p<=mid) ret=Query(p,lson);
else ret=Query(p,rson);
return ret;
}
void Change(int x,int y,int v)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
Update(w[top[x]],w[x],v,,n,);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
Update(w[x],w[y],v,,n,);//与边修改不同
}
int main()
{
//freopen("in.txt","r",stdin);
int m,p,u,v,c;
while(scanf("%d%d%d",&n,&m,&p)!=EOF)
{
memset(son,-,sizeof(son));
for(int i=;i<=n;i++) G[i].clear();
cnt=;
for(int i=;i<=n;i++)
scanf("%d",&camp[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs1(,,);
dfs2(,);
Build(,n,);
char cmd[];
for(int i=;i<=p;i++)
{
scanf("%s",&cmd);
if(cmd[]=='I')
{
scanf("%d%d%d",&u,&v,&c);
Change(u,v,c);
}
if(cmd[]=='D')
{
scanf("%d%d%d",&u,&v,&c);
Change(u,v,-c);
}
if(cmd[]=='Q')
{
scanf("%d",&c);
printf("%d\n",Query(w[c],,n,));
}
}
} }
11757337 2014-09-29 16:51:29 Accepted 3966 2484MS 8308K 3299 B C++ Physcal

HDU 3966(树链剖分+点修改+点查询)的更多相关文章

  1. hdu 3966 Aragorn's Story(树链剖分+区间修改+单点查询)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上 ...

  2. HDU 3966 /// 树链剖分+树状数组

    题意: http://acm.hdu.edu.cn/showproblem.php?pid=3966 给一棵树,并给定各个点权的值,然后有3种操作: I x y z : 把x到y的路径上的所有点权值加 ...

  3. HDU 3966 (树链剖分+线段树)

    Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...

  4. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  5. hdu 3966 树链剖分

    思路:树链剖分入门题,我这门入得好苦啊,程序很快写出来了,可是在LCA过程中把update函数里的左右边界位置写反了,一直RE到死. #pragma comment(linker, "/ST ...

  6. HDU 3966 树链剖分后线段树维护

    题意: 一棵树, 操作1.$path(a,b)$之间的点权$+k$ 操作2.单点查询 题解: 树链剖分即可,注意代码细节,双向映射 主要是记录一下板子 #include <string.h> ...

  7. POJ 2763 (树链剖分+边修改+边查询)

    题目链接:http://poj.org/problem?id=2763 题目大意:某人初始在s点.有q次移动,每次移动沿着树上一条链,每经过一条边有一定花费,这个花费可以任意修改.问每次移动的花费. ...

  8. HDU 3966 树链剖分+树状数组 模板

    Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. hdu 5274 树链剖分

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

随机推荐

  1. DrClient 校园网客户端破解

    好吧..详细点.这个功能就是破解学校的限制 让你开无线网共享给手机的时候 不会被断网 提示有代理软件..这样帮你电脑省好多流量.平板电脑也是 软件叫Process Explorer 不大 1M多 自己 ...

  2. 关于 datasnap Stream的英文博客能容

    转载:http://blogs.embarcadero.com/jimtierney/2009/04/06/31461/ DataSnap Server Method Stream Parameter ...

  3. HDOJ 1257 (最长字序列问题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1257 最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  4. CF#310 d2

    A:|c[1]-c[0]| B:A+-(oc)A[0]==0..n-1 C: #include <cstdio> int n,m,i,j,k,p; int ll,ca,cb,cc; int ...

  5. qq空间答案

    2073693795 懂得人自然会懂

  6. tcp/IP点对点通信程序

    点对点的通信 服务器端与客户端在建立连接之后创建一个进程 服务器端: 子进程用于接收主机的输入并将数据发送出去.父进程用于接收客户端的数据并输出到主机. 子进程一直等待主机的输入,输入的数据放在发送缓 ...

  7. Sharepoint程序员应该了解的知识

    做为一个Sharepoint程序员应该了解的知识:注意,我说的是程序员.因为我一直把自己看一个普普通通的程序员. 前提: 要知道网络基础(包括DHCP.IP.掩码.DNS.网关.广播),会装操作系统( ...

  8. ndk编译protobuf库

    ndk_r9编译通过,里面带了自动生成代码的脚本(tool/createPBFile.bat). 下载地址

  9. 为eclipse设置好看的代码主题

    eclipse的默认代码背景是白色,上个文章简单说了字体设置,这边主要介绍代码高亮的主题设置,打造更酷的编程界面.网上有文章说可以在设置里面逐一设置,但是比较麻烦,可以去网上下载现成的主题包,网址为: ...

  10. HTML、CSS选择题

    Java EE软件工程师认证考试 试题库-选择题   一.    选择题(包括单选和双选) 1.D 以下(    )是HTML常用的块状标签(选择一项) A. <span> B. < ...