【左偏树】 [JLOI2015]城池攻占
原来左偏树还可以打tag,get了
和线段树打tag一样,时不时Push_Down就好了
然后这里显然也是要先乘法后加法的
tag打上了之后还是其他一般左偏树差不多,有些细节注意一下
然后开 long long!!!
#include<bits/stdc++.h>
#define int long long
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M = 3e5+;
int a[M],h[M],v[M],c[M],n,m,head[M],ver[M<<],nxt[M<<],tot,val[M],son[M][],dis[M],fa[M];
int mul[M],add[M],dep[M],ans1[M],ans2[M];
inline void Add(int x,int y){ver[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
#define ls son[x][0]
#define rs son[x][1]
inline void Down(int x,int mull,int addd){
if(!x) return;
val[x]*=mull,val[x]+=addd;
mul[x]*=mull,add[x]*=mull,add[x]+=addd;
}
inline void Push_Down(int x){
Down(ls,mul[x],add[x]);
Down(rs,mul[x],add[x]);
mul[x]=,add[x]=;
}
int Merge(int x,int y){
if(!x||!y) return x|y;
Push_Down(x);Push_Down(y);
if(val[x]>val[y]) swap(x,y);
rs=Merge(rs,y);
if(dis[ls]<dis[rs]) swap(ls,rs);
dis[x]=dis[rs]+;
return x;
}int Pop(int x){return Merge(ls,rs);}
void dfs(int x){
for(int i=head[x];i;i=nxt[i]){
dep[ver[i]]=dep[x]+;
dfs(ver[i]);
fa[x]=Merge(fa[x],fa[ver[i]]);
}
while(fa[x]&&val[fa[x]]<h[x]){
Push_Down(fa[x]);
ans1[x]++;ans2[fa[x]]=dep[c[fa[x]]]-dep[x];
fa[x]=Pop(fa[x]);
}if(a[x]) Down(fa[x],v[x],);
else Down(fa[x],,v[x]);
}
signed main(){
n=read(),m=read();
for(int i=;i<=n;i++) h[i]=read();
for(int x,i=;i<=n;i++) x=read(),Add(x,i),a[i]=read(),v[i]=read();
for(int i=;i<=m;i++){
val[i]=read(),c[i]=read(),mul[i]=;
fa[c[i]]=Merge(fa[c[i]],i);
}dep[]=,dfs();
while(fa[]){
Push_Down(fa[]);
ans2[fa[]]=dep[c[fa[]]];
fa[]=Pop(fa[]);
}
for(int i=;i<=n;i++) writeln(ans1[i]);
for(int i=;i<=n;i++) writeln(ans2[i]);
return ;
}
【左偏树】 [JLOI2015]城池攻占的更多相关文章
- luogu3261 懒惰左偏树 [JLOI2015]城池攻占
目录 题目 思路 错误&&反思 代码 题目 luogu 原来左偏树真的能懒惰下放 那这篇博客应该要咕咕了 一开始我按照那篇博客想了一下,感觉emm,还是瞄了一眼看到了pushdown ...
- 【BZOJ4003】【JLOI2015】城池攻占(左偏树)
题面 题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi ...
- [JLOI2015]城池攻占 左偏树
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi &l ...
- 【左偏树】【P3261】 [JLOI2015]城池攻占
Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其 ...
- [luogu3261 JLOI2015] 城池攻占 (左偏树+标记)
传送门 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的 ...
- [洛谷P3261] [JLOI2015]城池攻占(左偏树)
不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...
- P3261 [JLOI2015]城池攻占 (左偏树+标记下传)
左偏树还是满足堆的性质,节点距离就是离最近的外节点(无左或者右儿子 或者二者都没有)的距离,左偏性质就是一个节点左儿子的距离不小于右儿子,由此得:节点距离等于右儿子的距离+1. 本题就是对于每个节点 ...
- BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...
- BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)
左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...
随机推荐
- ionic-CSS:ionic Range
ylbtech-ionic-CSS:ionic Range 1.返回顶部 1. ionic Range ionic Range 是一个滑块控件,ionic 为 Range 提供了很多种默认的样式.而且 ...
- 转:container_of分析 研究内核的博客
源地址:http://blog.csdn.net/tigerjibo/article/details/8299589 2012-12-15 19:23 1636人阅读 评论(2) 收藏 举报 目录 ...
- jq选项卡切换功能
效果图: <!DOCTYPE html> <html lang="en"> <head> <style> *{margin:0;pa ...
- 好文 | MySQL 索引B+树原理,以及建索引的几大原则
Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:小宝鸽 blog.csdn.net/u013142781/article/details/51706790 MySQL ...
- jsonArray转换成List
从字符串String转换成List 字符串格式: String jsonstr = "{'studentsjson':[{'student':'张三'},{'student':'李四'}] ...
- 【第三周读书笔记】浅谈node.js中的异步回调和用js-xlsx操作Excel表格
在初步学习了node.js之后,我发现他的时序问题我一直都很模糊不清,所以我专门学习了一下这一块. 首先我们来形象地理解一下进程和线程: 进程:CPU执行任务的模块.线程:模块中的最小单元. 例如:c ...
- JS对象 Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的。数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的
Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个"下标",用来表示它在数组中的位置,是从零开始的 数组定义的方法: 1. 定 ...
- The linux command 之存储媒介
一.常用的命令 mount:挂载文件系统 unmount:卸载文件系统 fdisk:硬盘分区命令 fdformat:格式化软盘 fsck:检查和修复文件系统 mkfs:创建文件系统 dd:转换和拷贝一 ...
- axios调用接口
axios调用接口 1. 按照axiosnpm install --save-dev axios2.在main.js 引入axios, 设置全局属性$http 指向axios main.js impo ...
- JAVA数据结构之二叉树
用树作为存储数据的结构兼具像数组一样查询速度快和像链表一样具有很快的插入和删除数据项的优点 我们用圆点表示节点,连接圆的直线表示边如下图所示就表示了一颗树,接下来我们讨论的二叉树即每个节点最多只有两个 ...