JZOJ 4895【NOIP2016提高A组集训第16场11.15】三部曲
题目

对于 \(50%\) 的数据,\(1<=n<=1000,1<=p<=300\)
对于 \(100%\) 的数据,\(1<=n<=50000,1<=p<=100000,1<=x<=n,0<=k<=1000\)
分析
树上子树加的操作让我们联想到线段树的区间加
然后我们就可以用 \(dfs\) 序把子树弄到序列里
于是考虑怎么加
记根节点深度为 \(0\)
那么让整个子树加 \(k-dep_x\),再有的贡献就是一个节点的深度乘上被加的次数
于是线段树维护即可
\(Code\)
#include<cstdio>
#define LL long long
#define ls (k << 1)
#define rs (ls | 1)
using namespace std;
const int N = 5e4 + 5;
int n , p , dfc , tot , dfn[N] , dep[N] , siz[N] , h[N] , rev[N];
LL d[N] , sum[N * 4] , tag_s[N * 4] , tag_c[N * 4];
struct edge{
	int to , nxt;
}e[N];
inline void add(int x , int y){e[++tot] = edge{y , h[x]} , h[x] = tot;}
void dfs(int x)
{
	dfn[x] = ++dfc , rev[dfc] = x , siz[x] = 1;
	for(register int i = h[x]; i; i = e[i].nxt)
	{
		int v = e[i].to;
		dep[v] = dep[x] + 1;
		dfs(v);
		siz[x] += siz[v];
	}
}
void pushdown(int l , int r , int k)
{
	if (tag_s[k] == 0 && tag_c[k] == 0) return;
	int mid = (l + r) >> 1;
	sum[ls] += tag_s[k] * (mid - l + 1) + tag_c[k] * (d[mid] - d[l - 1]);
	tag_s[ls] += tag_s[k] , tag_c[ls] += tag_c[k];
	sum[rs] += tag_s[k] * (r - mid) + tag_c[k] * (d[r] - d[mid]);
	tag_s[rs] += tag_s[k] , tag_c[rs] += tag_c[k];
	tag_s[k] = tag_c[k] = 0;
}
void update(int l , int r , int k , int tl , int tr , int v)
{
	if (tl <= l && r <= tr)
	{
		sum[k] += 1LL * (r - l + 1) * v + (d[r] - d[l - 1]);
		tag_s[k] += v , tag_c[k] += 1;
		return;
	}
	pushdown(l , r , k);
	int mid = (l + r) >> 1;
	if (tl <= mid) update(l , mid , ls , tl , tr , v);
	if (tr > mid) update(mid + 1 , r , rs , tl , tr , v);
	sum[k] = sum[ls] + sum[rs];
}
LL query(int l , int r , int k , int tl , int tr)
{
	if (tl <= l && r <= tr) return sum[k];
	pushdown(l , r , k);
	int mid = (l + r) >> 1;
	LL res = 0;
	if (tl <= mid) res += query(l , mid , ls , tl , tr);
	if (tr > mid) res += query(mid + 1 , r , rs , tl , tr);
	return res;
}
int main()
{
	freopen("truetears.in" , "r" , stdin);
	freopen("truetears.out" , "w" , stdout);
	scanf("%d%d" , &n , &p);
	int x , y;
	for(register int i = 2; i <= n; i++) scanf("%d" , &x) , add(x , i);
	dfs(1);
	for(register int i = 1; i <= dfc; i++) d[i] = d[i - 1] + dep[rev[i]];
	char opt[5];
	for(register int i = 1; i <= p; i++)
	{
		scanf("%s" , opt);
		if (opt[0] == 'A')
		{
			scanf("%d%d" , &x , &y);
			update(1 , n , 1 , dfn[x] , dfn[x] + siz[x] - 1 , y - dep[x]);
		}
		else {
			scanf("%d" , &x);
			printf("%lld\n" , query(1 , n , 1 , dfn[x] , dfn[x] + siz[x] - 1));
		}
	}
}
JZOJ 4895【NOIP2016提高A组集训第16场11.15】三部曲的更多相关文章
- JZOJ 【NOIP2016提高A组集训第16场11.15】兔子
		JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ... 
- JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线
		JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ... 
- 【JZOJ4895】【NOIP2016提高A组集训第16场11.15】三部曲
		=v= 因为外来的入侵,国王决定在某些城市加派士兵.所有城市初始士兵数量为0.当城市 被加派了k名士兵时.城市i的所有子城市需要被加派k+1名士兵.这些子城市的所有子城市需要被加派k+2名士兵.以此类 ... 
- 【JZOJ4894】【NOIP2016提高A组集训第16场11.15】SJR的直线
		题目描述 数据范围 解法 考虑逐次加入每一条直线. 对于当前已加入的直线集合L,现在要新加入一条直线l. 那么它产生的贡献,与平行线有关. 对于任意三条直线,如果其中任意两条平行,那么将不做贡献. 所 ... 
- 【JZOJ4896】【NOIP2016提高A组集训第16场11.15】兔子
		题目描述 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子窝之 ... 
- 【NOIP2016提高A组集训第4场11.1】平衡的子集
		题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ... 
- 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP
		好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ... 
- 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
		题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ... 
- 【NOIP2016提高A组集训第14场11.12】随机游走
		题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ... 
- 【NOIP2016提高A组集训第13场11.11】最大匹配
		题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ... 
随机推荐
- fbterm的配置,纯文本终端显示中文
			安装 fbterm sudo apt-get install fbterm 设置普通用户可以执行 fbterm 命令 sudo adduser username video #username为用户名 ... 
- github上fork2.4k,star8.7k的这款状态机,原来长这样!
			大家好,我是陶朱公Boy. 前言 上一篇文章<关于状态机的技术选型,最后一个真心好>我跟大家聊了一下关于"状态机"的话题. 于是就有小伙伴私信我,自己项目也考虑引入co ... 
- APACHE快速安装流程梳理
			操作参考教程:https://www.cnblogs.com/haw2106/p/9839655.html 快速安装开始: [环境配置1] yum -y install gcc gcc-c++ wge ... 
- Android 内存缓存框架 LruCache 的实现原理,手写试试?
			本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在之前的文章里,我们聊到了 LRU 缓存淘汰算法,并且分析 Java 标准库中支持 ... 
- 4.9:MapReduce之WordCount
			〇.概述 1.拓扑结构 2.目标 使用hadoop的MapReduce来实现计数. 一.启动服务 二.新建计算的文件 三.上传文件 四.分析文件 cd ~/bigdatahadoop jar Word ... 
- C++四舍五入并且保留7为小数
			问题描述给定圆的半径r,求圆的面积.输入格式输入包含一个整数r,表示圆的半径.输出格式输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积.说明:在本题中,输入是一个整数,但是输出是一个实数 ... 
- SQLMap入门——获取字段内容
			查询完字段名称之后,获取该字段的具体数据信息 python sqlmap.py -u http://localhost/sqli-labs-master/Less-1/?id=1 -D mysql - ... 
- 源码解读之TypeScript类型覆盖检测工具type-coverage
			因为团队内部开启了一个持续的前端代码质量改进计划,其中一个专项就是TS类型覆盖率,期间用到了type-coverage这个仓库,所以借这篇文章分享一下这个工具,并顺便从源码阅读的角度来分析一下该工具的 ... 
- [LeetCode]至少是其他数字两倍的最大数
			题目 代码 class Solution { public: int dominantIndex(vector<int>& nums) { vector<int> so ... 
- Golang如何实现节假日不打扰用户?
			 1.场景 想象下以下场景,嘿嘿...! 一个iphone用户,闹钟是可以按节假日不响的! 每日新闻机器人,节假日是可以不打扰我的! 我的业务,节假日是可以... 2.思路 要实现识别节假日,大概有 ... 
