贴一下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 ...
随机推荐
- uC/OS-II信号(OS_sem)块
/*************************************************************************************************** ...
- 获取字符串中每个字符出现的次数(利用TreeMap)
案例:"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)分析1:定义一个字符串(可以改进为键盘录入)2:定义一个 ...
- Socket通信的理解
1.Socket(套接字) 是支持TCP/IP通信的基本操作单元.包含通信的五种必须信息:通信使用的协议,本机IP和端口,远程IP和端口. 2. 1.TCP连接 手机能够使用联网功能是因为手机底层实现 ...
- dig的用法
Dig是linux中的域名解析工具,功能比nslookup强很多,使用也很方便,不用象nslookup总是set不停. Dig是domain information groper的缩写,知道了来源想必 ...
- Java递归算法——变位字
轮换的含义 1.c ats --> 2.ca st 3.c tsa --> 4.ct as 5.c sat --> 6.cs ta 7. atsc import java.io.Bu ...
- JavaWeb学习笔记——XML和SAX解析区别
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【七】——实现资源的分页
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 这篇文章我们将使用不同的方式实现手动分页(关于高端大气上档次的OData本文暂不涉及,但有可 ...
- HTML 个人资料框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Hermite Curve
http://paulbourke.net/miscellaneous/interpolation/ http://fivedots.coe.psu.ac.th/Software.coe/Java%2 ...
- JS中的 公有变量、私有变量 !
公有变量.私有变量 ! 初学者的见解,算是记录学习过程,也算是分享以便共同成长,如有不正确的地方,还请不吝赐教! 先看代码1: function car(){ var wheel = 3; //私有变 ...