树链剖分(线段树区间更新求和(lazy操作)hdu3966)
题意:给出一颗树形图,有三种操作,I:在u到v的路径上的每个点的权值+d,D:在u到v的路径上的每个点的权值都-d,Q询问u点的权值
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"algorithm"
#include"math.h"
#include"vector"
#include"queue"
#include"map"
#include"string"
#define M 100009
#define Maxm 10000
#define inf 1000000000
#define eps 1e-7
#define pps 1e-18
#define PI acos(-1.0)
#define LL __int64
using namespace std;
struct node
{
int u,v,next;
}edge[M*2];
int t,head[M],son[M],num[M],p[M],fa[M],fp[M],deep[M],value[M],pos,top[M];
void init()
{
t=pos=0;
memset(head,-1,sizeof(head));
memset(son,-1,sizeof(son));
}
void add(int u,int v)
{
edge[t].u=u;
edge[t].v=v;
edge[t].next=head[u];
head[u]=t++;
}
void dfs(int u,int f,int d)
{
deep[u]=d;
num[u]=1;
fa[u]=f;
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].v;
if(v!=f)
{
dfs(v,u,d+1);
num[u]+=num[v];
if(son[u]==-1||num[v]>num[son[u]])
son[u]=v;
}
}
}
void getpos(int u,int sp)
{
top[u]=sp;
p[u]=++pos;
fp[p[u]]=u;
if(son[u]==-1)return;
getpos(son[u],sp);
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(v!=fa[u]&&v!=son[u])
getpos(v,v);
}
}
struct Tree
{
int l,r,add,flag;
}tree[M*4];
void push(int i)
{
if(tree[i].l==tree[i].r)return;
if(tree[i].flag)
{
tree[i<<1].add+=tree[i].add;
tree[i<<1].flag=1;
tree[i<<1|1].add+=tree[i].add;
tree[i<<1|1].flag=1;
tree[i].flag=tree[i].add=0;
}
}
void make(int l,int r,int i)
{
tree[i].l=l;
tree[i].r=r;
tree[i].flag=1;
tree[i].add=0;
if(l==r)
return;
int mid=(l+r)>>1;
make(l,mid,i<<1);
make(mid+1,r,i<<1|1);
}
void updata(int l,int r,int i,int k)
{
if(tree[i].l==l&&tree[i].r==r)
{
tree[i].add+=k;
tree[i].flag=1;
return;
}
push(i);
int mid=(tree[i].l+tree[i].r)>>1;
if(r<=mid)
updata(l,r,i<<1,k);
else if(l>mid)
updata(l,r,i<<1|1,k);
else
{
updata(l,mid,i<<1,k);
updata(mid+1,r,i<<1|1,k);
}
}
int query(int q,int i)
{
if(tree[i].l==q&&tree[i].r==q)
return tree[i].add;
push(i);
int mid=(tree[i].l+tree[i].r)>>1;
if(q<=mid)
return query(q,i<<1);
else
return query(q,i<<1|1);
}
void lcp(int u,int v,int k)
{
int f1=top[u];
int f2=top[v];
while(f1!=f2)
{
if(deep[f1]<deep[f2])
{
swap(f1,f2);
swap(u,v);
}
updata(p[f1],p[u],1,k);
u=fa[f1];
f1=top[u];
}
if(deep[u]>deep[v])
swap(u,v);
updata(p[u],p[v],1,k);
}
int main()
{
int n,m,Q,i,u,v,d;
char str[5];
while(scanf("%d%d%d",&n,&m,&Q)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&value[i]);
init();
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs(1,1,1);
getpos(1,1);
make(1,pos,1);
while(Q--)
{
scanf("%s",str);
if(str[0]=='I')
{
scanf("%d%d%d",&u,&v,&d);
lcp(u,v,d);
}
else if(str[0]=='D')
{
scanf("%d%d%d",&u,&v,&d);
lcp(u,v,-d);
}
else
{
scanf("%d",&u);
printf("%d\n",value[u]+query(p[u],1));
}
}
}
return 0;
}
树链剖分(线段树区间更新求和(lazy操作)hdu3966)的更多相关文章
- POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )
POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...
- 【bzoj2325】[ZJOI2011]道馆之战 树链剖分+线段树区间合并
题目描述 给定一棵树,每个节点有上下两个格子,每个格子的状态为能走或不能走.m次操作,每次修改一个节点的状态,或询问:把一条路径上的所有格子拼起来形成一个宽度为2的长方形,从起点端两个格子的任意一个开 ...
- BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)
BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...
- Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组
Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...
- Aizu 2450 Do use segment tree 树链剖分+线段树
Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...
- bzoj2243[SDOI2011]染色 树链剖分+线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9012 Solved: 3375[Submit][Status ...
- BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树
题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...
- fzu 2082 过路费 (树链剖分+线段树 边权)
Problem 2082 过路费 Accept: 887 Submit: 2881Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- 【bzoj1036】树的统计[ZJOI2008]树链剖分+线段树
题目传送门:1036: [ZJOI2008]树的统计Count 这道题是我第一次打树剖的板子,虽然代码有点长,但是“打起来很爽”,而且整道题只花了不到1.5h+,还是一遍过样例!一次提交AC!(难道前 ...
随机推荐
- useful tools, excel import mysql,swagger
http://www.th7.cn/Program/java/201602/765943.shtml------swagger http://blog.csdn.net/csfreebird/arti ...
- ADB not responding. If you'd like to retry, then please manually kill "adb.exe" and click 'Restart'
ADB not responding. If you'd like to retry, then please manually kill "adb.exe" and click ...
- VS2013修改MVC4默认生成的模板
找到以下目录,根据VS版本和安装目录不同相应改动: I:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTempla ...
- Silverlight页面通过继承扩展实现
在Silverlight中有些项目对UserControl重新做了封装基类,如PageBase,要求项目中每个页面都要从PageBase派生,但是过程比较坎坷,本文针对这个功能点的实现以及实现过程中遇 ...
- Mongoose在向集合中插入文档时的集合命名问题
Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操作. 从创建连接到向数据库中写入一个条数据经历了以下步骤: 1.连 ...
- 浏览器获取ip地址
/** * 获取浏览器的ip地址 * @param request * @return */ public static String getIP(HttpServletRequest request ...
- JS之script标签
1.script标签的位置 script标签可以在head标签中,也可以在body标签中 2.async属性 async的目的是不让页面等待js文件的下载和执行,从而异步加载页面中的其他内容.只支持外 ...
- 如何安装sass
1.安装ruby 2. 运行ruby时输入 gem install 及sass安装文件路径. sass安装文件见文件.
- C#事务相关
之前在程序中用到事务时,都是在存储过程中创建事务来对数据进行控制,其实在C#中也有事务类. 1.DbTransaction类对数据库访问添加事务,它是对数据库事务操作的基类,继承此类的有: Sys ...
- APICloud上openFrameGroup把菜单挡住了,怎么处理?
问:openFrameGroup把菜单挡住了,怎么处理? 试了sendFrameToBack没反应,又不能页面自己openFrameGroup,不知道该怎么办.而且用另外的页面先openFrameGr ...