#线段树,树状数组#CodeChef Merciless Chef
分析
首先按照dfs序将子树转换为区间,其实就是区间减和区间维护最小值判断是否大于0
因为大于0一定最多只有 \(n\) 个,所以直接将一个数记录被删除并设为正无穷。
代码
#include <cstdio>
#include <cctype>
#include <vector>
using namespace std;
const int N=100011; vector<int>K[N];
int dfn[N],nfd[N],tot,a[N],rfn[N],c[N],n,w[N<<2],p[N<<2],lazy[N<<2];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
void dfs(int x){
int len=K[x].size();
dfn[x]=++tot,nfd[tot]=x;
for (int i=0;i<len;++i) dfs(K[x][i]);
rfn[x]=tot;
}
void pup(int k){
if (w[k<<1]<w[k<<1|1]) p[k]=p[k<<1],w[k]=w[k<<1];
else p[k]=p[k<<1|1],w[k]=w[k<<1|1];
}
void build(int k,int l,int r){
if (l==r){
p[k]=l,w[k]=a[nfd[l]];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pup(k);
}
void update(int k,int l,int r,int x,int y,int z){
if (l==x&&r==y){
lazy[k]+=z,w[k]+=z;
return;
}
int mid=(l+r)>>1;
if (lazy[k]){
w[k<<1|1]+=lazy[k],lazy[k<<1|1]+=lazy[k];
w[k<<1]+=lazy[k],lazy[k<<1]+=lazy[k],lazy[k]=0;
}
if (y<=mid) update(k<<1,l,mid,x,y,z);
else if (x>mid) update(k<<1|1,mid+1,r,x,y,z);
else update(k<<1,l,mid,x,mid,z),update(k<<1|1,mid+1,r,mid+1,y,z);
pup(k);
}
void upd(int k,int l,int r,int x){
if (l==r){
w[k]=0x3f3f3f3f,
lazy[k]=0,p[k]=l;
return;
}
int mid=(l+r)>>1;
if (lazy[k]){
w[k<<1|1]+=lazy[k],lazy[k<<1|1]+=lazy[k];
w[k<<1]+=lazy[k],lazy[k<<1]+=lazy[k],lazy[k]=0;
}
if (x<=mid) upd(k<<1,l,mid,x);
else upd(k<<1|1,mid+1,r,x);
pup(k);
}
void Update(int x){for (;x<=n;x+=-x&x) --c[x];}
int query(int x){int ans=0; for (;x;x-=-x&x) ans+=c[x]; return ans;}
int main(){
n=iut(),tot=-1,a[0]=0x3f3f3f3f;
for (int i=1;i<=n;++i)
a[i]=iut(),K[iut()].push_back(i),c[i]=-i&i;
dfs(0),build(1,1,n);
for (int Q=iut();Q;--Q){
int opt=iut(),x=iut();
if (opt==1){
int y=iut();
if (dfn[x]<rfn[x]) update(1,1,n,dfn[x]+1,rfn[x],-y);
while (w[1]<=0) Update(p[1]),upd(1,1,n,p[1]);
}else print(query(rfn[x])-query(dfn[x])),putchar(10);
}
return 0;
}
#线段树,树状数组#CodeChef Merciless Chef的更多相关文章
- CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)
The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...
- Codechef EDGEST 树套树 树状数组 线段树 LCA 卡常
原文链接http://www.cnblogs.com/zhouzhendong/p/9016579.html 题目传送门 - Codechef EDGEST 题意 给定相同点集上的两棵生成树$T_1$ ...
- Code Chef JUMP(递推+树状数组+李超线段树)
\(JUMP\) 很容易写出转移柿子 \[f_i=\min_{p_j<p_i}\{(h_i-h_j)^2+f_j\}+w_i\] 把\(\min\)里面的东西展开一下 \[f_j=\min_{p ...
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...
- 【xsy2111】 【CODECHEF】Chef and Churus 分块+树状数组
题目大意:给你一个长度为$n$的数列$a_i$,定义$f_i=\sum_{j=l_i}^{r_i} num_j$. 有$m$个操作: 操作1:询问一个区间$l,r$请你求出$\sum_{i=l}^{r ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- HDU 1556 线段树或树状数组,插段求点
1.HDU 1556 Color the ball 区间更新,单点查询 2.题意:n个气球,每次给(a,b)区间的气球涂一次色,问最后每个气球各涂了几次. (1)树状数组 总结:树状数组是一个查 ...
- HDU 3966 Aragorn's Story 树链剖分+树状数组 或 树链剖分+线段树
HDU 3966 Aragorn's Story 先把树剖成链,然后用树状数组维护: 讲真,研究了好久,还是没明白 树状数组这样实现"区间更新+单点查询"的原理... 神奇... ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description The inve ...
随机推荐
- 擅长使用iter
def populate_ranks(votes, ranks): names = list(votes.keys()) names.sort(key=votes.get, reverse=True) ...
- iterables/generators/yield
iterables # 当你创建了一个列表,你可以一个一个的读取它的每一项,这叫做iteration: >>> mylist = [1,2,3] >>> for i ...
- iOS APP包瘦身,你在工作中真的会关注吗?
安装包组成 谈到 App 瘦身,最直接的想法莫过于分析一个安装包内部结构,了解其每一部分的来源.解压一个 ipa 包,拿到其 payload 中 app 文件的数据,整理归类后其大致如下: Exect ...
- 【Azure Data Lake Storage】如何才能保留Blob中的文件目录结构(即使文件夹中文件数量为0的情况下)?
问题描述 在使用Azure Storage Account Blob时候,发现当文件夹中的Blob(文件)被全部输出后,文件夹也会消失? 为什么它不能像Windows系统中的文件夹一样,即使是一个空文 ...
- 【Azure 微服务】Azure Service Fabric 因证书问题而使得 Node 一直处于 Down 状态
问题描述 Service Fabric 集群更新证书后,重启Node后就变为Down的状态,反复 Restart 结果反复Down 问题分析 根据Service Fabric的文档表示,修改证书时一定 ...
- 基于 Nebula Graph 构建图学习能力
本文首发于 Nebula Graph Community 公众号 经常看技术文章的小伙伴可能会留意到除了正在阅读的那篇文章,在文章页面的正文下方或者右侧区域会有若干同主题.同作者的文章等你阅读:经常逛 ...
- C++ 多线程笔记2 线程同步
C++ 多线程笔记2 线程同步 并发(Concurrency)和并行(Parallelism) 并发是指在单核CPU上,通过时间片轮转的方式,让多个任务看起来像是同时进行的.实际上,CPU在一个时间段 ...
- C#---串口调试助手
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 usin ...
- Docker下搭建Redis集群并实现动态扩/缩容
一.Redis集群方案的简单介绍 Redis集群的方案一般分为三种: 哈希取余分区 一致性哈希算法分区 哈希槽分区(本文介绍的就是这种) 1.哈希取余分区: 优点: 简单粗暴,只要提前预估好数据量,然 ...
- RIPEMD算法:多功能哈希算法的瑰宝
一.RIPEMD算法的起源与历程 RIPEMD(RACE Integrity Primitives Evaluation Message Digest)算法是由欧洲研究项目RACE发起,由Hans D ...