原来左偏树还可以打tag,get了

和线段树打tag一样,时不时Push_Down就好了

然后这里显然也是要先乘法后加法的

tag打上了之后还是其他一般左偏树差不多,有些细节注意一下

然后开 long long!!!

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define writeln(x) write(x),puts("")
  4. #define writep(x) write(x),putchar(' ')
  5. using namespace std;
  6. inline int read(){
  7. int ans=,f=;char chr=getchar();
  8. while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
  9. while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
  10. return ans*f;
  11. }void write(int x){
  12. if(x<) putchar('-'),x=-x;
  13. if(x>) write(x/);
  14. putchar(x%+'');
  15. }const int M = 3e5+;
  16. 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];
  17. int mul[M],add[M],dep[M],ans1[M],ans2[M];
  18. inline void Add(int x,int y){ver[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
  19. #define ls son[x][0]
  20. #define rs son[x][1]
  21. inline void Down(int x,int mull,int addd){
  22. if(!x) return;
  23. val[x]*=mull,val[x]+=addd;
  24. mul[x]*=mull,add[x]*=mull,add[x]+=addd;
  25. }
  26. inline void Push_Down(int x){
  27. Down(ls,mul[x],add[x]);
  28. Down(rs,mul[x],add[x]);
  29. mul[x]=,add[x]=;
  30. }
  31. int Merge(int x,int y){
  32. if(!x||!y) return x|y;
  33. Push_Down(x);Push_Down(y);
  34. if(val[x]>val[y]) swap(x,y);
  35. rs=Merge(rs,y);
  36. if(dis[ls]<dis[rs]) swap(ls,rs);
  37. dis[x]=dis[rs]+;
  38. return x;
  39. }int Pop(int x){return Merge(ls,rs);}
  40. void dfs(int x){
  41. for(int i=head[x];i;i=nxt[i]){
  42. dep[ver[i]]=dep[x]+;
  43. dfs(ver[i]);
  44. fa[x]=Merge(fa[x],fa[ver[i]]);
  45. }
  46. while(fa[x]&&val[fa[x]]<h[x]){
  47. Push_Down(fa[x]);
  48. ans1[x]++;ans2[fa[x]]=dep[c[fa[x]]]-dep[x];
  49. fa[x]=Pop(fa[x]);
  50. }if(a[x]) Down(fa[x],v[x],);
  51. else Down(fa[x],,v[x]);
  52. }
  53. signed main(){
  54. n=read(),m=read();
  55. for(int i=;i<=n;i++) h[i]=read();
  56. for(int x,i=;i<=n;i++) x=read(),Add(x,i),a[i]=read(),v[i]=read();
  57. for(int i=;i<=m;i++){
  58. val[i]=read(),c[i]=read(),mul[i]=;
  59. fa[c[i]]=Merge(fa[c[i]],i);
  60. }dep[]=,dfs();
  61. while(fa[]){
  62. Push_Down(fa[]);
  63. ans2[fa[]]=dep[c[fa[]]];
  64. fa[]=Pop(fa[]);
  65. }
  66. for(int i=;i<=n;i++) writeln(ans1[i]);
  67. for(int i=;i<=n;i++) writeln(ans2[i]);
  68. return ;
  69. }

【左偏树】 [JLOI2015]城池攻占的更多相关文章

  1. luogu3261 懒惰左偏树 [JLOI2015]城池攻占

    目录 题目 思路 错误&&反思 代码 题目 luogu 原来左偏树真的能懒惰下放 那这篇博客应该要咕咕了 一开始我按照那篇博客想了一下,感觉emm,还是瞄了一眼看到了pushdown ...

  2. 【BZOJ4003】【JLOI2015】城池攻占(左偏树)

    题面 题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi ...

  3. [JLOI2015]城池攻占 左偏树

    题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi &l ...

  4. 【左偏树】【P3261】 [JLOI2015]城池攻占

    Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其 ...

  5. [luogu3261 JLOI2015] 城池攻占 (左偏树+标记)

    传送门 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的 ...

  6. [洛谷P3261] [JLOI2015]城池攻占(左偏树)

    不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...

  7. P3261 [JLOI2015]城池攻占 (左偏树+标记下传)

    左偏树还是满足堆的性质,节点距离就是离最近的外节点(无左或者右儿子  或者二者都没有)的距离,左偏性质就是一个节点左儿子的距离不小于右儿子,由此得:节点距离等于右儿子的距离+1. 本题就是对于每个节点 ...

  8. BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆

    https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...

  9. BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)

    左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...

随机推荐

  1. Noip 2012 day2t1 同余方程

    Description 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. Input 输入文件为mod.in. 输入只有一行,包含两个正整数 a, b,用一个空格隔开. Output 输 ...

  2. BackgroundWorker study

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. LOL遇到登录服务器问题,未能连接到网络原因

    通过打开各种浏览器,发现只有IE不能上网,QQ之类的都能上网,不能登入LOL 只有IE是出现:远程计算机或设备将不接受连接 这个问题 解决办法是: 1.win+r --> 输入regedit 打 ...

  4. 牛客B-Xor Path /// 求所有Path( i->j )( j >= i )路径的异或和

    题目大意: https://ac.nowcoder.com/acm/contest/272/B?&headNav=acm 给定一棵n个点的树,每个点有权值.定义表示  到  的最短路径上,所有 ...

  5. 网页布局WEB标准的HTML结构化

    您正在学习WEB标准CSS网页布局吗?是不是还不能完全掌握纯CSS布局?通常有两种需要您特别注意: 第一种可能是你还没有理解CSS处理页面的原理.在你考虑你的页面整体表现效果前,你应当先考虑内容的语义 ...

  6. 实时收集Storm日志到ELK集群

    背景 我们的storm实时流计算项目已经上线几个月了,由于各种原因迟迟没有进行监控,每次出现问题都要登录好几台机器,然后使用sed,shell,awk,vi等各种命令来查询原因,效率非常低下,而且有些 ...

  7. JAVA时间工具类用法

    1.获得N天前的TIMESTAMP Calendar cl = Calendar.getInstance(); cl.add(Calendar.DAY_OF_YEAR, -7); Date date ...

  8. 用js判断是否是微信浏览器

      //判断是否是微信浏览器的函数 function isWeiXin(){ //window.navigator.userAgent属性包含了浏览器类型.版本.操作系统类型.浏览器引擎类型等信息,这 ...

  9. 计算a,b,c的排列组合

    递归实现,思路的确有点难得想: public void SortAll(List<string> list,int start,int end) { if (start==end) { f ...

  10. 笔记23 搭建Spring MVC

    搭建一个最简单的SpringMVC示例 1.配置DispatcherServlet DispatcherServlet是Spring MVC的核心.在这里请求会第一次 接触到框架,它要负责将请求路由到 ...