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 ...
随机推荐
- JMS介绍
JMS简单描述: JMS即Java消息服务(Java Message Service),是一个Java平台中面向消息中间件的API,用于在两个应用程序之间或分布式系统中发送.接受消息,从而进行异步通信 ...
- Git学习手记
直接使用github的客户端即可 1.简介 集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生.这类系统,诸如 CVS,Subv ...
- AutoFac之 Named and Keyed 方式注入
AutoFac是.net framework下一个高效的ioc容器,传说中的效率最快(我偷偷看了几篇测试博文,确实这个容器的效率遥遥领先). 好了废话不多说,AutoFac的使用方式请看:http:/ ...
- 飞檐走壁navMesh
http://www.manew.com/thread-106030-1-1.html
- 腾讯蔡晨:十年沉淀,腾讯iOA为企业安全保驾护航
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 背景:5月23-24日,以"焕启"为主题的腾讯"云+未来"峰会再广州召开,广东省各级政府机构领导.海 ...
- SQL脚本整理系列一 分隔函数
原来效果: fName Scroe 王某某 ,, 李某某 , 王某某 李某某 李某某 ,, 王某某 执行后效果: name score 李某某 李某某 李某某 王某某 王某某 王某某 王某某 王某某 ...
- flutter initializing gradle终极解决方案
自己开发的公众号,可以领取淘宝内部优惠券 修改flutter.gradle文件 这种做法网上一大堆的教程,如果你还没改过建议先试下,比如这篇 Flutter 运行 一直Initializing gra ...
- Please, configure Web Facet first!idea报这错的解决办法!!
Please, configure Web Facet first!idea报这错的解决办法!! 今天在idea导入用eclipse的项目,然后运行项目的时候报这个错, 看下图 网上找了好多都没解决, ...
- git的commit规范及强制校验
1.背景 在多人协作项目中,如果代码风格统一.代码提交信息的说明准确,那么在后期协作以及Bug处理时会更加方便. 先来介绍本人公司采用的commit规范 Commit message格式 < ...
- mysql 字符串转换呈毫秒值
SELECT CEIL((UNIX_TIMESTAMP('2011-05-31 23:59:59') - UNIX_TIMESTAMP('2011-05-31 00:59:59'))/1000/60/ ...