【hdu3966】Aragorn's Story
题意:给一棵树,并给定各个点权的值,然后有3种操作:
I C1 C2 K: 把C1与C2的路径上的所有点权值加上K
D C1 C2 K:把C1与C2的路径上的所有点权值减去K
Q C:查询节点编号为C的权值
裸裸的树剖
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; typedef long long LL; #define N 50010 struct Node
{
int to,next;
}e[N<<]; int id,cnt;
int head[N];
int num[N],siz[N],top[N],son[N];
int dep[N],pos[N],rank1[N],fa[N]; LL sum[N<<],add[N<<]; char s[]; int n,m,q;
int u,v;
int al,ar,ask; inline void init()
{
memset(son,-,sizeof(son));
memset(head,-,sizeof(head));
id=;
cnt=;
} void link(int x,int y)
{
e[++cnt]=(Node){y,head[x]};
head[x]=cnt;
} void dfs(int x,int father,int d)
{
siz[x]=;
dep[x]=d;
fa[x]=father;
for (int i=head[x];~i;i=e[i].next)
{
int t=e[i].to;
if (t!=fa[x])
{
dfs(t,x,d+);
siz[x]+=siz[t];
if (son[x]==- || siz[x]>siz[son[x]])
son[x]=t;
}
}
} void dfs2(int x,int cha)
{
top[x]=cha;
pos[x]=++id;
rank1[pos[x]]=x;
if (son[x]==-)
return ;
dfs2(son[x],cha);
for(int i=head[x];~i;i=e[i].next)
{
int t=e[i].to;
if(t!=son[x] && t!=fa[x])
dfs2(t,t);
}
} void pushup(int now)
{
sum[now]=max(sum[now<<],sum[now<<|]);
} void pushdown(int now,int m)
{
if (add[now])
{
add[now<<]+=add[now];
add[now<<|]+=add[now];
sum[now<<]+=add[now]*(m-(m>>));
sum[now<<|]+=add[now]*(m>>);
add[now]=;
}
} void build(int nowl,int nowr,int now)
{
add[now]=;
if (nowl==nowr)
{
sum[now]=num[rank1[nowl]];
return ;
}
int mid=(nowl+nowr)>>;
build(nowl,mid,now<<);
build(mid+,nowr,now<<|);
pushup(now);
} void update(int nowl,int nowr,int now,int L,int R,int d)
{
if (nowl>=L && nowr<=R)
{
add[now]+=d;
sum[now]+=d*(nowr-nowl+);
return ;
}
pushdown(now,nowr-nowl+);
int mid=nowl+nowr>>;
if (L<=mid) update(nowl,mid,now<<,L,R,d);
if (mid<R) update(mid+,nowr,now<<|,L,R,d);
pushup(now);
} int query(int nowl,int nowr,int now,int d)
{
int res();
if (nowl==nowr)
return sum[now];
pushdown(now,nowr-nowl+);
int mid=nowl+nowr>>;
if (d<=mid) res=query(nowl,mid,now<<,d);
else res=query(mid+,nowr,now<<|,d);
pushup(now);
return res;
} void work(int x,int y,int val)
{
while (top[x]!=top[y])
{
if (dep[top[x]]<dep[top[y]])
swap(x,y);
update(,n,,pos[top[x]],pos[x],val);
x=fa[top[x]];
}
if (dep[x]>dep[y])
swap(x,y);
update(,n,,pos[x],pos[y],val);
}
int main()
{
while (scanf("%d%d%d",&n,&m,&q)!=EOF && n+m+q)
{
init();
for (int i=;i<=n;i++)
scanf("%d",&num[i]);
for (int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
link(u,v);
link(v,u);
}
dfs(,,);
dfs2(,);
build(,n,);
while (q--)
{
scanf("%s",s);
if (s[]=='I')
{
scanf("%d%d%d",&al,&ar,&ask);
work(al,ar,ask);
}
else if (s[]=='D')
{
scanf("%d%d%d",&al,&ar,&ask);
work(al,ar,-ask);
}
else
{
scanf("%d",&ask);
printf("%d\n",query(,n,,pos[ask]));
}
}
}
return ;
}
【hdu3966】Aragorn's Story的更多相关文章
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
随机推荐
- JavaScript exec()方法
exec() 方法用于检索字符串中的正则表达式的匹配.返回一个数组,其中存放匹配的结果.如果未找到匹配,则返回值为 null. var str = "我今年25岁明年26岁后年27岁千年24 ...
- 【spring】jar包详解与模块依赖关系
以spring3.X为例 jar包详解 1. spring-core.jar:包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心: 2. spri ...
- mysql主库与从库配置(并行复制配置)
主库: [mysqld] server-id = 2233port = 13306basedir = /usr/local/mysqldatadir = /usr/local/mysql/data s ...
- 零基础入门学习Python(22)--函数:递归是神马
知识点 递归是神马? 递归是属于算法的范畴. 递归就是函数调用自身的一种行为. >>> def g(): return g() >>> g() Traceback ...
- Java 文件操作大集合
package com.sess.hny.sys.fileserver; import java.io.BufferedInputStream;import java.io.BufferedOutpu ...
- Win2008 Server搭建FTP服务器
首先创建一个专门的FTP用户,当然也可以不创建. 用系统自带的超管用户. 设置用户名和密码.用户下次登陆必须修改密码记得去掉勾选. 在角色里面的WEB服务器找到添加角色服务.我之前有安装IIS. 没有 ...
- python 连接sqlserver: pymssql
停了一个月,终于还是把这个做了,工作需要!!!在装pymssql时,一直报错,确定了要先装freetds: 1. 安装freetds时报错,搜索到要先进行如下操作: brew unlink freet ...
- 集训第六周 数学概念与方法 概率 F题
Submit Status Description Sometimes some mathematical results are hard to believe. One of the common ...
- source insight中的快捷键总结
1.快捷键 1,Shift+F8高亮显示指定字符. 2,Ctrl+F找出来的结果用F4,F3前进后退查找. 3,Alt+,后退alt+.前进查找关键字. 4,Alt+G或者F5跳转到某个固定的行号. ...
- 立方体 反射 CubeMap
立方体反射(CubeMap) 在虚拟环境中,我们需要模拟材质球反射周围的环境,立方体反射正是让材质球反射出天空盒的背景的方法之一. 原理 当我们观察物体时,物体表面足够光滑,再视线方向和物体相交的点上 ...