#线段树,树状数组#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 ...
随机推荐
- 【Android逆向】frida 破解 jwxdxnx02.apk
apk 路径: https://pan.baidu.com/s/1cUInoi 密码:07p9 这题比较简单,主要是用于练习frida 1. 安装apk到手机 需要输入账号密码 2. 使用jdax 查 ...
- java+文件实现的超市管理系统
一.需求 1.使用java语言实现系统 2.数据存储使用io读写文件 3.超市的商品管理+销售功能 二.效果 商品列表 商品增删改查 购买 三.说明 1.开发工具/技术 java eclipse 2 ...
- 在Vue中使用Canvas绘制背景
好家伙, 在vue中使用canvas绘制与在html中使用canvas绘制大致相同, 但又有所区别 法一(无图片资源): vue中canvas的使用 - 掘金 (juejin.cn) 找到canca ...
- 【Azure 应用服务】在Azure上部署一套VUE框架的单页面应用,有什么可以参考的文档呢?
问题描述 在Azure上部署一套VUE框架的单页面应用,有什么可以参考的文档呢? 问题回答 Azure官方上并没有VUE框架的实例代码,但是可以参考Node JS项目,来进行设置. 在 Azure 中 ...
- C/C++、C#、JAVA(三):字符串操作
C/C++.C#.JAVA(三):字符串操作 目录 C/C++.C#.JAVA(三):字符串操作 定义字符串 C C++ C# JAVA 捕捉输入和输出 等值比较 C/C++ C# JAVA 字符串操 ...
- Codeforces Round 729 (Div. 2)B. Plus and Multiply(构造、数学)
题面 链接 B. Plus and Multiply 题意 给定\(n,a,b\) 可以进行的操作 \(*a\) \(+b\) 最开始的数是1 问能否经过上面的两种操作将1变为n 题解 这题的关键是能 ...
- 基于python的环境噪声监测报警系统实例解析
一 系统简介 1.简介 该系统可以实时显示噪声量大小,并进行一段时间的噪声统计. 2.特性 实现噪声值的统计 实现了噪声显示 完整的主题和样式控制 多线程的运行模式 二 源码解析 1.串口db值获取: ...
- Android 混淆打包后gson报错Missing type parameter
原文: Android 混淆打包后gson报错Missing type parameter - Stars-One的杂货小窝 记录一个简单的bug 在代码中使用了gson将json转为list: va ...
- docker跑es流程再整理
参考,欢迎点击原文:https://blog.csdn.net/qq_32101993/article/details/100021002(报错) 继老早前一篇文章整理的使用docker-compos ...
- Welcome to YARP - 3 负载均衡 (Load Balancing)
目录 Welcome to YARP - 1.认识YARP并搭建反向代理服务 Welcome to YARP - 2.配置功能 2.1 - 配置文件(Configuration Files) 2.2 ...