noip模拟赛 三部曲


分析:子树上操作,要用到线段树+dfs序,关键就是子树内k还要增加,这个就不是很好办.可以求出在根节点+0后每个点会加多少,记为d[i],如果要对点x进行A操作,实际上只需要对子树加k - d[i]再加上子树的d[i]和,但是在实际求答案的时候不能直接求出子树和+Σd[i],因为如果你没有修改的话答案本该是0,程序却会输出一个数.因此还要维护一个线段树,记录Σd[i],每次在修改操作的时候将信息合并到第一个线段树上.还要注意的是每个点加的次数不同Σd[i]对答案是有影响的,不能单单只下传一个增加标记,还要记录当前节点增加了多少次,如果点x增加k,那么它的子节点就要增加(k - d[x]) * son[x] + Σd[son[x]] * cnt[x],son[x]为x的子节点,cnt[x]为x增加了多少次.
这道题比较麻烦,要很快反应过来这道题用dfs序+线段树来做,把每次增加变成在一个标准量上增加.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ; typedef long long ll; ll dfs_clock, n, p, head[maxn], to[maxn * ],d[maxn], nextt[maxn * ], tot = ;
ll l[maxn], r[maxn], v[maxn], c[maxn << ], tag[maxn << ], L[maxn << ], R[maxn << ], c2[maxn << ], cnt[maxn << ]; void add(ll x, ll y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(ll u, ll dep)
{
v[u] += dep;
l[u] = ++dfs_clock;
d[dfs_clock] = dep;
for (int i = head[u]; i; i = nextt[i])
{
int vv = to[i];
dfs(vv, dep + );
v[u] += v[vv];
}
r[u] = dfs_clock;
} void pushup2(int o)
{
c2[o] = c2[o * ] + c2[o * + ];
} void pushup(int o)
{
c[o] = c[o * ] + c[o * + ];
} void pushdown(int o)
{
if (cnt[o])
{
tag[o * ] += tag[o];
tag[o * + ] += tag[o];
cnt[o * ] += cnt[o];
cnt[o * + ] += cnt[o];
c[o * ] += tag[o] * (R[o * ] - L[o * ] + ) + cnt[o] * c2[o * ];
c[o * + ] += tag[o] * (R[o * + ] - L[o * + ] + ) + cnt[o] * c2[o * + ];
tag[o] = cnt[o] = ;
}
} void build(int o, int l, int r)
{
L[o] = l;
R[o] = r;
if (l == r)
{
c2[o] = d[l];
return;
}
int mid = (l + r) >> ;
build(o * , l, mid);
build(o * + , mid + , r);
pushup2(o);
} void update(int o, int l, int r, int x, int y, int p)
{
if (x <= l && r <= y)
{
tag[o] += p;
cnt[o]++;
c[o] += p * (r - l + ) + c2[o];
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
update(o * , l, mid, x, y, p);
if (y > mid)
update(o * + , mid + , r, x, y, p);
pushup(o);
} ll query(int o, int l, int r, int x, int y)
{
if (x <= l && r <= y)
return c[o];
pushdown(o);
int mid = (l + r) >> , res = ;
if (x <= mid)
res += query(o * , l, mid, x, y);
if (y > mid)
res += query(o * + , mid + , r, x, y);
return res;
} int main()
{
scanf("%lld%lld", &n, &p);
for (int i = ; i <= n; i++)
{
int u;
scanf("%d", &u);
add(u, i);
}
for (int i = ; i <= n; i++)
if (!l[i])
dfs(i, );
build(, , n);
while (p--)
{
char ch[];
int x, k;
scanf("%s", ch);
if (ch[] == 'A')
{
scanf("%d%d", &x, &k);
k -= d[l[x]];
update(, , n, l[x], r[x], k);
}
else
{
scanf("%d", &x);
printf("%lld\n", query(, , n, l[x], r[x]));
}
} return ;
}
noip模拟赛 三部曲的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- bzoj1106
模拟+树状数组 先开始以为是先删距离最小的,这样可以减小上下的距离,然后觉得很难写,看码长很短,就看了题解,结果很奥妙 我们只考虑两种元素,就是如果像-a-b-a-b-这样的肯定得交换,如果像-a-b ...
- bzoj1061&&bzoj3256
http://www.lydsy.com/JudgeOnline/problem.php?id=1061 单纯形... 先开始我不知道对偶,看着代码不知所措,并不能懂他们写的是什么... 单纯形的标准 ...
- 1章 课程介绍 IDEA介绍演示与安装 IDEA安装
- 8.3 TCPIP协议族
接下来我们要学习的内容是TCP/IP协议族.TCP/IP协议族在网络系统中是非常重要的.这一个协议族当中牵涉到许许多多的我们平常所用到的协议.TCP/IP呢它也有分层模型.然后我们讲到的就是三方面的内 ...
- E20170621-hm
detroit 底特律 giant n. 巨人,大汉; 巨兽,巨物; 卓越人物 woo vt. 求爱,求婚; 争取…的支持; convince vt. 使相信,说服,使承认; 使明白; ...
- RocketMQ(2)
1. 消费端集群消费(负载均衡) 示例代码: /** * Producer,发送消息 * */ public class Producer { public static void main(Stri ...
- 1.1输出“hello,world”
#include<iostream> using namespace std; int main() { cout<<"Hello, World!"< ...
- BZOJ 4140 凸包+二进制分组
思路: $(x_0-x)^2+(y_0-y)^2<=x^2+y^2$ $y>=(-x_0/y_0)x+(x_0^2+y_0^2)/2y0$ 这显然就是凸包了 以一个斜率不断向下(上)走 ...
- [转]Linux之ACL权限
转自:http://www.2cto.com/os/201110/108736.html 引言 前面的内容中,我们讲到传统的权限仅有三种身份(owner,group,others)搭配三种权限(r,w ...
- Java继承体系中this的表示关系
在继承关系下,父类中的this关键字并不总是表示父类中的变量和方法.this关键字的四种用法如前文所述,列举如下. 1) this(paras…); 访问其他的构造方法 2) this.xxx; 访问 ...