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 ...
随机推荐
- Linux mmap 要主动释放共享内存
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sta ...
- http和web缓存
1.http的缓存类型 缓 存对于一个网站来说非常重要,可以提高网站性能,减少冗余的数据传输,增加服务器负担,web存储则给浏览器提供了更加强大的保存文件的接口.关于web下的http缓存类型比较 ...
- Kafka消费不到数据的特殊情况
我大约是把kafka消费不到数据的特殊情况都经历了一遍了吧= =. kafka消费不到数据的原因,首先检查配置之类的,如是否设置了group.id,对应的topic是否正确等等,这些不多说. 下面是我 ...
- 在使用反射时,maven设置依赖范围引起的异常
背景是,运用annotation进行权限控制,将一个包下面的类.进行反射,然后判断类的annotation,根据annotation设置权限 问题来了,包下面有5个类,在反射时报了 javqx.ser ...
- 信号和槽:Qt中最差劲的创造
不要被这个标题唬住了,实际上我是非常认可Qt的.在C++实现的开源产品中没有哪一个的API风格比得上Qt,拥有高度一致性,符合常识,符合直觉,几乎不用学就可以直接上手.或许是由于我们摆脱不了马太效应的 ...
- B站视频下载(VideoHelper)
继续上次的知乎爬虫, 这次开始了哔哩哔哩的爬虫实践: 首先介绍下如何下载吧: VideoHelper 里面有三种方式下载b站视频. 同样的流程, 还是先抓包,分析参数,寻找参数(包括之前的请求包和页面 ...
- PHP邮件发送
php带有内置的mail() 发送邮件函数,但是较为繁琐:建议上网下载一个PHPMailer:
- TerraBuilder创建地形之去除影像黑边,填充影像
最近在Skyline项目中使用TerraBuilder创建地形,由于地形比较大,分块下载卫星影像,然后再TerraBuilder中合并,由于合并.图形等等问题,导致创建处理出来的地形中存在严重的缝隙和 ...
- 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software ...
- Juniper 防火墙端口映射设置
首先我们登陆到juniper防火墙控制界面 默认地址大家都知道(192.168.1.1) 默认用户和密码netsscreen 下面介绍登陆界面: 让我们开始配置吧 依次展开policy → Polic ...