【左偏树】 [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 ...
随机推荐
- Noip 2012 day2t1 同余方程
Description 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. Input 输入文件为mod.in. 输入只有一行,包含两个正整数 a, b,用一个空格隔开. Output 输 ...
- BackgroundWorker study
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- LOL遇到登录服务器问题,未能连接到网络原因
通过打开各种浏览器,发现只有IE不能上网,QQ之类的都能上网,不能登入LOL 只有IE是出现:远程计算机或设备将不接受连接 这个问题 解决办法是: 1.win+r --> 输入regedit 打 ...
- 牛客B-Xor Path /// 求所有Path( i->j )( j >= i )路径的异或和
题目大意: https://ac.nowcoder.com/acm/contest/272/B?&headNav=acm 给定一棵n个点的树,每个点有权值.定义表示 到 的最短路径上,所有 ...
- 网页布局WEB标准的HTML结构化
您正在学习WEB标准CSS网页布局吗?是不是还不能完全掌握纯CSS布局?通常有两种需要您特别注意: 第一种可能是你还没有理解CSS处理页面的原理.在你考虑你的页面整体表现效果前,你应当先考虑内容的语义 ...
- 实时收集Storm日志到ELK集群
背景 我们的storm实时流计算项目已经上线几个月了,由于各种原因迟迟没有进行监控,每次出现问题都要登录好几台机器,然后使用sed,shell,awk,vi等各种命令来查询原因,效率非常低下,而且有些 ...
- JAVA时间工具类用法
1.获得N天前的TIMESTAMP Calendar cl = Calendar.getInstance(); cl.add(Calendar.DAY_OF_YEAR, -7); Date date ...
- 用js判断是否是微信浏览器
//判断是否是微信浏览器的函数 function isWeiXin(){ //window.navigator.userAgent属性包含了浏览器类型.版本.操作系统类型.浏览器引擎类型等信息,这 ...
- 计算a,b,c的排列组合
递归实现,思路的确有点难得想: public void SortAll(List<string> list,int start,int end) { if (start==end) { f ...
- 笔记23 搭建Spring MVC
搭建一个最简单的SpringMVC示例 1.配置DispatcherServlet DispatcherServlet是Spring MVC的核心.在这里请求会第一次 接触到框架,它要负责将请求路由到 ...