树链剖分(线段树区间更新求和(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!(难道前 ...
随机推荐
- phpCAS::handleLogoutRequests()关于java端项目登出而php端项目检测不到的测试
首先,假如你有做过cas,再假如你的cas里面有php项目,这个时候要让php项目拥有cas的sso功能,你需要改造你的项目,由于各人的项目不同,但是原理差不多,都是通过从cas服务器获取sessio ...
- MYSQL启动报1067错误,系统日志中是“服务 mysql 意外停止” Mysql日志中则是:“Plugin \'FEDERATED\' is disabled”
MYSQL启动报1067错误,系统日志中是"服务 mysql 意外停止" Mysql日志中则是:"Plugin \'FEDERATED\' is disabled&quo ...
- SQL 编辑
局部变量: DECLARE @variable_name Datatype Variable_naem为局部变量的名称,Datatype为数据名称. 例如: DECLARE @name varchar ...
- PHP实现QQ第三方登录
PHP实现QQ第三方登录 学习之前,请大家先看一下oAuth协议. 首先呢,我们进入QQ互联的官方网站 http://connect.qq.com登入我们自己的QQ号,没有QQ号的小伙伴可以忽略本篇博 ...
- 【android学习2】:Eclipse中HttpServlet类找不到
Eclipse中使用的HttpServlet类之所以识别不到的原因是没有导入Servlet-api.jar包,这个包在所安装在的tomcat的lib文件下,所以只需要导入即可. 在需要导入的工程上右键 ...
- django internal search
最近改进了项目中的站内搜索的功能,增加了全文索引,提升了搜索速度.因为项目框架是django,所以采用django+haystack+pyelasticsearch+elasticsearch的方式实 ...
- CS6破解
1) 序列号这里为大家生成了两个,可以通过软件验证:1325-0949-2080-9819-3777-32301325-0160-5283-9851-2671-8951 2) 破解补丁安装时会用到,请 ...
- PySe-001-基础环境配置(MacOX)
Python 是一种面向对象.解释型计算机程序设计语言,其源代码同样遵循 GPL(GNU General Public License)协议.Python语法简洁而清晰,具有丰富和强大的类库.由于Py ...
- zero1--hibernate注解02
- 转载:如何运用VI编辑器进行查找替换
使用vi编辑器编辑长文件时,常常是头昏眼花,也找不到需要更改的内容. 这时,使用查找功能尤为重要. 方法如下: 1.命令模式下输入“/字符串”,例如“/Section 3”. 2.如果查找下一个,按“ ...