分析:

无论父节点增加了多少,子节点的增量总比父节点多1。

这种差分的关系是保存不变的,我们可以一遍dfs根据结点深度得到在根结点的每个点的系数。

估且把一开始的结点深度称做c0吧,对于子树的修改就只是结点的系数就只是c0+d,d是修正值。

dfs得到树的dfs序列,子树的结点连续,就变成区间更新了。

区间更新的时候,在线段树上保存好初始的系数,修改的时候把系数的lazy标记和普通的lazy标记分开。

这道题学到的新东西:在线段树上不仅可以总体+d,还可以总体增加某一系列特定的系数

这个系数甚至是可变的,感觉这里可以挖掘一下。

/*********************************************************
* ------------------ *
* author AbyssFish *
**********************************************************/
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
#include<numeric>
#include<climits>
using namespace std; typedef long long ll;
const int MAX_N = 5e4+;
//MAX_P = 1e5 , K <= 1e3
int fa[MAX_N];
int son[MAX_N], bro[MAX_N]; int N;
int dep[MAX_N]; int L[MAX_N], R[MAX_N];
int c[MAX_N]; //dfs_order
int dfs_clk; void dfs(int u = ,int d = )
{
c[dfs_clk] = dep[u] = d;
L[u] = dfs_clk++;
for(int v = son[u]; v; v = bro[v]){
dfs(v,d+);
}
R[u] = dfs_clk;
} #define para int o = 1,int l = 0,int r = N
#define lo (o<<1)
#define ro (o<<1|1)
#define Tvar int md = (l+r)>>1;
#define lsn lo,l,md
#define rsn ro,md,r
#define insd ql <= l && r <= qr const int ST_SIZE = <<;
ll t_c[ST_SIZE];//O 5e4*5e4/2
ll sum[ST_SIZE];//O 1e5*(1e3*5e4+5e4*5e4/2)
int dwn_c[ST_SIZE];//O 1e5
ll dwn[ST_SIZE];//O (5e4+1e3)*1e5 void build(para)
{
sum[o] = ;
if(r-l == ){
t_c[o] = c[l];
}
else {
dwn_c[o] = dwn[o] = ;
Tvar
build(lsn);
build(rsn);
t_c[o] = t_c[lo]+t_c[ro];
}
} inline void sink_d(int o,ll d,int len)
{
sum[o] += len*d;
dwn[o] += d;
} inline void sink_c(int o,int k)
{
sum[o] += t_c[o]*k;
dwn_c[o] += k;
} inline void push_down(int o,int l,int r)
{
if(dwn_c[o]){
sink_c(lo,dwn_c[o]);
sink_c(ro,dwn_c[o]);
dwn_c[o] = ;
}
if(dwn[o]){
Tvar
sink_d(lo,dwn[o],md-l);
sink_d(ro,dwn[o],r-md);
dwn[o] = ;
}
} #define upara d,ql,qr
void update(int d,int ql,int qr,para)
{
if(insd){
sink_d(o,d,r-l);//O 5e4+1e3
sink_c(o,);
}
else {
Tvar
push_down(o,l,r);
if(ql < md) update(upara,lsn);
if(qr > md) update(upara,rsn);
sum[o] = sum[lo] + sum[ro];
}
} ll query(int ql,int qr,para)
{
if(insd) return sum[o];
else {
Tvar
push_down(o,l,r);
ll re = ;
if(ql < md) re += query(ql,qr,lsn);
if(qr > md) re += query(ql,qr,rsn);
return re;
}
} void solve()
{
int i, P;
scanf("%d%d",&N,&P);
memset(son+,,sizeof(int)*N);
for(i = ; i <= N; i++){
scanf("%d",fa+i);
bro[i] = son[fa[i]];
son[fa[i]] = i;
} dfs_clk = ;
dfs();
build(); char op[];
int u;
while(P--){
scanf("%s%d",op,&u);
if(*op == 'A'){
scanf("%d",&i);
update(i-dep[u],L[u],R[u]);
}
else {
printf("%lld\n",query(L[u],R[u]));
}
}
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int T, kas = ;
scanf("%d",&T);
while(++kas <= T){
printf("Case #%d:\n",kas);
solve();
}
return ;
}

UESTC 574 High-level ancients的更多相关文章

  1. cdoj 574 High-level ancients dfs序+线段树

    High-level ancients Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/s ...

  2. cdoj 574 High-level ancients dfs序+线段树 每个点所加权值不同

    High-level ancients Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/s ...

  3. zoj The 12th Zhejiang Provincial Collegiate Programming Contest Demacia of the Ancients

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5504  The 12th Zhejiang Provincial ...

  4. 第十二届浙江省大学生程序设计大赛-Demacia of the Ancients 分类: 比赛 2015-06-26 14:39 30人阅读 评论(0) 收藏

    Demacia of the Ancients Time Limit: 2 Seconds Memory Limit: 65536 KB There is a popular multiplayer ...

  5. 简洁常用权限系统的设计与实现(六):不维护节点的深度level,手动计算level,构造树 (把一颗无序的树,变成有序的)

     本篇介绍的方法,参考了网上的代码.在递归过程中,计算level,是受到了这种方法的启发. CSDN上有篇关于树的算法,目标是把一个无序的树,变成有序的. 我看了下代码,并运行了下,感觉是可行的. 我 ...

  6. Java compiler level does not match解决方法

    从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclipse报Description  Resource Path Location Type Java compiler level d ...

  7. Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead的解决办法

    今天在导入工程进Eclipse的时候竟然出错了,控制台输出的是: [2013-02-04 22:17:13 - takepicture] Android requires compiler compl ...

  8. Android版本和API Level对应关系

    http://developer.android.com/guide/topics/manifest/uses-sdk-element.html Platform Version       API ...

  9. [LeetCode] Binary Tree Level Order Traversal II 二叉树层序遍历之二

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

随机推荐

  1. Linux acpi off学习的必要

    ACPI是Intel(i386,x86_64,IA64)平台的标准固件规范,绝大部分OS需要从BIOS得到的信息都可以从ACPI得到,并且现在的趋势是未来的任何新的特性相关的信息都只能从ACPI得到. ...

  2. 《The Python Standard Library》——http模块阅读笔记1

    官方文档:https://docs.python.org/3.5/library/http.html 偷个懒,截图如下: 即,http客户端编程一般用urllib.request库(主要用于“在这复杂 ...

  3. python基础学习-思维导图总结

  4. Thinkphp基于规则的Auth权限认证类

      PS:onethink是基于该权限认证类实现,Auth类作为官方类库,在Library\Think里面. 其实Auth类也是基于角色访问控制RBAC扩展的,具体到节点的权限校验方式还是需要根据业务 ...

  5. Zookeeper概念学习系列之zookeeper是什么?

    1. Zookeeper是Hadoop的分布式协调服务. 2. 分布式应用程序可以基于它,来实现同步服务,配置维护和命名服务等. 3. zookeeper可以保证数据在zookeeper集群之间的数据 ...

  6. TCP-Java--图谱

  7. 揭秘TDSQL全时态数据库系统的核心技术

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯技术工程官方号发表在腾讯云+社区 Design 本节讨论T-TDSQL的关键之处,即影响T-TDSQL架构的设计之处.一是新的数据 ...

  8. 【linux相识相知】网络属性配置

    当我们拥有一个崭新的计算机的时候,第一步恐怕都是迫不及待的下载各种软件,看视频,听音乐等,这里的关键的一点是要有网络.现在的个人计算机大部分都是windows操作系统的,接入网络网络很简单,插上网线也 ...

  9. bzoj 4771: 七彩树

    Description 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有 ...

  10. 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP

    前言 Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责SRP) The ...