UESTC 574 High-level ancients
分析:
无论父节点增加了多少,子节点的增量总比父节点多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的更多相关文章
- cdoj 574 High-level ancients dfs序+线段树
High-level ancients Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/s ...
- cdoj 574 High-level ancients dfs序+线段树 每个点所加权值不同
High-level ancients Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/s ...
- 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 ...
- 第十二届浙江省大学生程序设计大赛-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 ...
- 简洁常用权限系统的设计与实现(六):不维护节点的深度level,手动计算level,构造树 (把一颗无序的树,变成有序的)
本篇介绍的方法,参考了网上的代码.在递归过程中,计算level,是受到了这种方法的启发. CSDN上有篇关于树的算法,目标是把一个无序的树,变成有序的. 我看了下代码,并运行了下,感觉是可行的. 我 ...
- Java compiler level does not match解决方法
从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclipse报Description Resource Path Location Type Java compiler level d ...
- 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 ...
- Android版本和API Level对应关系
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html Platform Version API ...
- [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 ...
随机推荐
- VI设计对于企业文化建设的重要性
VI设计对于企业文化建设非常重要,包括企业品牌形象塑造.企业价值提炼.企业文化建设等有着非常重要的作用.VI设计的发展趋势是什么? 第一 从静态到动态 中国过去一段时间以来的VI设计,也是以一种静止和 ...
- CentOS 下 安装 JDK8
1.下载 在 /usr/local 目录下创建目录 java # cd /usr/local # mkdir java 登录网址:http://www.oracle.com/technetwork/j ...
- Nagios 利用NSClient++的check_nrpe方式使用自定义脚本监控windows
分类 NsClient++来监控windows主机有三种方式:check_nt.check_nrpe.nsca.check_nt自带很多功能,但是扩展性差,check_nrpe可以通过执行自己定义的脚 ...
- postgres formencode.api.Invalid
错误提示: Invalid: expected an int in the IntCol 'geom', got <type 'str'> '010100000007EBFFFC3A611 ...
- .net mvc 设置div的动态部分视图内容 dynamic partial view
示例效果:点击按钮,在div中 显示不同的partial view的内容 $("#btnEdit").click(function () { //动态获取相应的部分视图 var u ...
- VS2008、 VS2010 、 VS2012、 VS2013 都能用的快捷键
VS2008. VS2010 . VS2012. VS2013 都能用的快捷键 Ctrl+E,D --格式化全部代码 Ctrl+K,F --格式 ...
- 【U1结业机试题】新闻内容管理系统:解析XML文件读取Html模版生成网页文件
一.作业要求: 1.在xml文件中创建新闻节点news,包含标题.作者.日期.正文等信息 2.创建HTML模板文件 3.读取xml中所有新闻信息,并使用新闻信息替换模板文件中占位符,从而为每一条新闻生 ...
- 探寻hashmap
Hashmap源码 1. 构造器: a)获得默认数组大小:1>>4 :16 b) 获得负载因子:0.75:衡量hashmap的空间使用程度 i.过大:使用空间更加充分,但是查找效率变低, ...
- intellij idea里神坑的@autowire
当你写完项目的时侯serviceimpl层下的@autowire->对应的是dao层的注入,其下面会出现一条红线 在Intellij Idea开发工具在@Autowired或者@Resource ...
- 分布式环境Tomcat多节点集群下共享目录配置,tomcat虚拟目录+nfs
我们可能有这种场景: 集群环境下,多个web容器需要请求一个共享目录下的文件,比如保存图片或者录音文件,任意一个节点保存后其他节点需要及时获取,此时就需要目录进行同步了,否则Nginx负载到任意一个节 ...