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 ...
随机推荐
- [BZOJ 3132] 上帝造题的七分钟
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3132 [算法] 二维树状数组 [代码] #include<bits/stdc+ ...
- Kernel trick----PRML读书笔记
Many linear parametric models can be re-cast into an equivalent 'dual representstion' in which the p ...
- Spark SQL读parquet文件及保存
import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.{Row, SparkSession} im ...
- astgo-官方提供的使用技巧大全
Astgo服务器相关: 1.Astgo支持双IP绑定,比如联通.电信IP,Astgo 默认SIP端口 5080和5061 菜单: 选项->系统设置 可以设置以上参数 2.支持RC4加密,自动判断 ...
- 3.4 目录和spooling
文件管理部分主要讲文件目录.文件目录它是用于检索文件的.文件目录它是一种文件系统实现按0存取的一种重要手段.一个文件目录它由若干个目录项组成的.每一个目录项它记录了一个文件的相关信息.这个文件信息指明 ...
- 【WIP】客户端JavaScript DOM
创建: 2017/10/12 初步完成: 2017/10/15 更新: 2017/10/14 标题加上[WIP],继续完成 [TODO] 补充暂略的, 搜[略] DOM树 概要 基本 ...
- A Few Words on Callbacks and Asynchronous Mechanism In Javascript
It is said that the one of the most routine work a javascript programmer do is writing codes like &q ...
- GIT分支的一些开发心得
从本地的master分支创建新的分支 $ git checkout -b dev Switched to a new branch 'dev' 上面那条命令可以分为两步 $ git branch de ...
- php三方网站使用微信公众号推送文章
//获取accesstoken 的方法public function index(){ $appId = 'wxd0e50fe967dccccc'; $appSecret = 'd7f6be12ce4 ...
- redis cluster集群理解
Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...