贴一下WC总结里提到的那道裸题吧。。。
[bzoj4034][HAOI2015]T2
试题描述
有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个
输入
第一行包含两个整数 N, M 。表示点数和操作数。
输出
对于每个询问操作,输出该询问的答案。答案之间用换行隔开。
输入示例
输出示例
数据范围
对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不会超过 10^6 。
题解
说了是裸题。。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; const int BufferSize = << ;
char buffer[BufferSize], *Head, *tail;
inline char Getchar() {
if(Head == tail) {
int l = fread(buffer, , BufferSize, stdin);
tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = , f = ; char c = Getchar();
while(!isdigit(c)){ if(c == '-') f = -; c = Getchar(); }
while(isdigit(c)){ x = x * + c - ''; c = Getchar(); }
return x * f;
} #define maxn 100010
#define maxm 200010
#define LL long long
int n, q, m, head[maxn], next[maxm], to[maxm], V[maxn]; void AddEdge(int a, int b) {
to[++m] = b; next[m] = head[a]; head[a] = m;
swap(a, b);
to[++m] = b; next[m] = head[a]; head[a] = m;
return ;
} int siz[maxn], fa[maxn], son[maxn], w[maxn], ww, top[maxn], val[maxn];
void dfs(int u) {
siz[u] = ;
for(int e = head[u]; e; e = next[e]) if(to[e] != fa[u]) {
fa[to[e]] = u;
dfs(to[e]);
siz[u] += siz[to[e]];
if(siz[son[u]] < siz[to[e]]) son[u] = to[e];
}
return ;
}
void build(int u, int tp) {
w[u] = ++ww; top[u] = tp;
if(son[u]) build(son[u], tp);
for(int e = head[u]; e; e = next[e]) if(to[e] != fa[u] && to[e] != son[u])
build(to[e], to[e]);
return ;
} LL sumv[maxn<<], addv[maxn<<];
void build(int L, int R, int o) {
if(L == R) sumv[o] = val[L];
else {
int M = L + R >> , lc = o << , rc = lc | ;
build(L, M, lc);
build(M+, R, rc);
sumv[o] = sumv[lc] + sumv[rc];
}
return ;
}
int ql, qr;
LL v;
void update(int L, int R, int o) {
if(ql <= L && R <= qr) addv[o] += v;
else {
int M = L + R >> , lc = o << , rc = lc | ;
if(ql <= M) update(L, M, lc);
if(qr > M) update(M+, R, rc);
sumv[o] = sumv[lc] + addv[lc] * (M - L + );
sumv[o] += sumv[rc] + addv[rc] * (R - M);
}
return ;
}
LL query(int L, int R, int o, LL Add) {
Add += addv[o];
if(ql <= L && R <= qr) return sumv[o] + Add * (R - L + );
int M = L + R >> , lc = o << , rc = lc | ;
LL ans = ;
if(ql <= M) ans += query(L, M, lc, Add);
if(qr > M) ans += query(M+, R, rc, Add);
return ans;
} LL query(int u) {
int f = top[u]; LL ans = ;
while(u) {
ql = w[f]; qr = w[u];
ans += query(, n, , );
u = fa[f]; f = top[u];
}
return ans;
} int main() {
n = read(); q = read();
for(int i = ; i <= n; i++) V[i] = read();
for(int i = ; i < n; i++) AddEdge(read(), read()); dfs();
build(, );
for(int i = ; i <= n; i++) val[w[i]] = V[i];
build(, n, );
while(q--) {
int tp = read(), u = read();
if(tp == ) {
v = read(); ql = qr = w[u];
update(, n, );
} else if(tp == ) {
v = read(); ql = w[u]; qr = ql + siz[u] - ;
update(, n, );
} else printf("%lld\n", query(u));
} return ;
}
直接贴代码吧……
贴一下WC总结里提到的那道裸题吧。。。的更多相关文章
- 群里提到的IE设置问题 ---B/S 下页面刷新问题
这里面四个选项的含义 下面是每个选项的作用和意义: 1. “每次访问此页时检查”选项表示浏览器每次访问一个页面时,不管浏览器是否缓存过此页面,都要向服务器发出访问请求.这种设置的优点是实时性很强,肯定 ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
- POJ 2104 求序列里第K大 主席树裸题
给定一个n的序列,有m个询问 每次询问求l-r 里面第k大的数字是什么 只有询问,没有修改 可以用归并树和划分树(我都没学过..囧) 我是专门冲着弄主席树来的 对主席树的建树方式有点了解了,不过这题为 ...
- APIO 2017 游记
//第一次写游记,只是流水账...结果好像确实只去游了…… day-11 省选挂了,即将退役……(然而apio之后得知并没有退役,感谢放我一条活路)(吐槽出题人考完才造数据,题目没有子任务之类的玩意, ...
- 树上启发式合并 (dsu on tree)
这个故事告诉我们,在做一个辣鸡出题人的比赛之前,最好先看看他发明了什么新姿势= =居然直接出了道裸题 参考链接: http://codeforces.com/blog/entry/44351(原文) ...
- 浅谈2-SAT(待续)
2-SAT问题,其实是一个逻辑互斥问题.做了两道裸题之后仔细想来,和小时候做过的“有两个女生,如果A是女生,那么B一定不是女生.A和C性别相同,求A.B.C三人的性别.”几乎是一样的. 对于这道题我们 ...
- CDQ分治&整体二分学习个人小结
目录 小结 CDQ分治 二维LIS 第一道裸题 bzoj1176 Mokia bzoj3262 陌上花开 bzoj 1790 矩形藏宝地 hdu5126四维偏序 P3157 [CQOI2011]动态逆 ...
- 谈谈javascript语法里一些难点问题(二)
3) 作用域链相关的问题 作用域链是javascript语言里非常红的概念,很多学习和使用javascript语言的程序员都知道作用域链是理解javascript里很重要的一些概念的关键,这些概 ...
- 把HDFS里的json数据转换成csv格式
1. 全景图 2. 用ListHDFS获取所有文件名 如果想重新再取一次,右健view state: 点击 clear state, 再运行,即可再次采集数据了. 3. 用FetchH ...
随机推荐
- Foundation框架--字典( NSDictionary NSMutableDictionary )
基础知识 1.字典不允许相同的key,但允许有相同的value. 2,字典是无序的,字典不能排序. 3.字典里的内容是成对存在的,不会出现单数. 4.快速创建的方式只适合不可变字典. 不可变字典 #i ...
- js日期计算及快速获取周、月、季度起止日,获取指定日期周数以及星期几的小例子
JS获取日期时遇到如下需求,根据某年某周获取一周的日期.如开始日期规定为星期四到下一周的星期五为一周. 格式化日期: function getNowFormatDate(theDate) { var ...
- js正则,电话,邮箱
1. <script type="text/javascript"> var str="Is this all th05777-89856825ere is5 ...
- Podfile升级后的影响
之前项目里用的Podfile都是版本 0.39 后面有一天电脑格盘重装以后cocoapods装的版本是 1.0.0.beta.6 那么问题来了,在下载或者clone一下项目后,经常是需要自己安装第三方 ...
- .NET软件开发与常用工具清单(转)
http://www.cnblogs.com/smileberry/p/4047835.html
- tomcat的文件路径 servelet的配置 以及maven中的WEB-INF的路径
Tomcat JavaWeb应用的组成结构 开发JavaWeb应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错 WebRoot →Web应用所在 ...
- Spring--Spring容器
在使用Spring所提供的各种丰富而神奇的功能之前,必须要在Spring IoC容器中装配好Bean,并建立Bean和Bean之间的关联关系. Spring提供了多种配置方式来实现Bean的装配.但在 ...
- js字符串转成数字的三种方法
js读取的html代码中获得的值 ,统统是以字符串的形式呈现的,为了方便我们后面对数据的操作,有时候我们有必要进行转换一下. 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转 ...
- Promise 异步(asynchronous )编程
概述 Promise.all(iterable) 方法返回一个promise,该promise会等iterable参数内的所有promise都被resolve后被resolve,或以第一个promis ...
- linux的bash 终端操作快捷键
bash中的快捷键操作: 分为两大类, 一是移动, 另一个是删除 一. 移动 1. 按字符移动: ctrl+f, ctrl+b 3. 按行移动: ctrl+a, ctrl+e 二. 删除: 1. 按字 ...