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 ...
随机推荐
- openstack Aio env deubg
- 68. 对Extjs中store的多种操作
转自:https://www.cnblogs.com/exmyth/archive/2013/05/16/3082045.html 先来个声明,看着不错,贴过来的,没都测试过. Store.getCo ...
- C#窗体间传值的简便方法/工具
一.问题:窗体间传值必须需要窗体之间有联系,具体有如下方式 窗体间传值涉及到窗体A必须拥有窗体B,这样才可以实现A-B之间传值 窗体A与窗体B在窗体/实例C中,A-B可互相通讯 其他方式,不细讨论,复 ...
- [Apple开发者帐户帮助]九、参考(2)撤销特权
您可以撤消的证书取决于证书类型和您的角色.如果您是个人注册,则可以撤销所有类型的开发和分发证书,除非另有说明.组织团队的任何成员都可以撤销自己的开发证书,但只有帐户持有人或管理员可以撤销分发证书. 证 ...
- Akka源码分析-Extension
一个设计优秀的工具或框架,应该都有一个易用.强大的插件或扩展体系,akka也不例外. akka的扩展方法非常简单,因为只涉及到两个组件:Extension. ExtensionId.其中Extensi ...
- ANDROID 开发之 SQLite
SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLit ...
- viewDidUnload,viewDidLoad,viewWillAppear,viewWillDisappear的作用以及区别
viewDidLoad:在视图加载后被调用 viewWillAppear:视图即将可见时调用.默认情况下不执行任何操作 viewDidAppear: 视图已完全过渡到屏幕上时调用 viewWillDi ...
- drupal 8——在CKEditor中导入video media时添加caption会导致video缩小至消失
在CKEditor中,我点击media browser,选择video型的media,并在caption中输入video的名字.当我保存后发现在前台页面的video消失了,只留下video的名字,点击 ...
- windows ping 某个网段,不能运行指定的软件
windows ping 某个网段,不能运行指定的软件 :begin @echo OFF color 0a Title Net Test Tool by:HRuinger Mode con cols= ...
- [Windows Server 2003] 还原SQL Server数据库
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:SQL Ser ...