传送门

每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上

然后开始dfs,每一次把子树里那些还活着的骑士合并上来

然后再考虑当前点的堆,一直pop直到骑士全死光或者剩下的骑士的攻击力都大于等于当前城池的生命值,同时维护城池和骑士的答案

然后修改的话在堆顶打一个标记,需要的时候下传即可

 1 //minamoto
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 using namespace std;
 5 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 6 char buf[1<<21],*p1=buf,*p2=buf;
 7 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
 8 inline ll read(){
 9     #define num ch-'0'
10     char ch;bool flag=0;ll res;
11     while(!isdigit(ch=getc()))
12     (ch=='-')&&(flag=true);
13     for(res=num;isdigit(ch=getc());res=res*10+num);
14     (flag)&&(res=-res);
15     #undef num
16     return res;
17 }
18 char sr[1<<21],z[20];int K=-1,Z;
19 inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
20 inline void print(int x){
21     if(K>1<<20)Ot();if(x<0)sr[++K]=45,x=-x;
22     while(z[++Z]=x%10+48,x/=10);
23     while(sr[++K]=z[Z],--Z);sr[++K]='\n';
24 }
25 const int N=3e5+5;
26 int head[N],Next[N],ver[N],tot;
27 inline void add_edge(int u,int v){
28     ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
29 }
30 int L[N],R[N],rt[N],d[N],ans1[N],ans2[N],dep[N],c[N],n,m;
31 ll add[N],mul[N],v[N],h[N],val[N];bool fl[N];
32 inline void ppd(int p,ll m,ll a){
33     if(p){
34         v[p]*=m,v[p]+=a;
35         mul[p]*=m,add[p]*=m,add[p]+=a;
36     }
37 }
38 inline void pd(int p){
39     ppd(L[p],mul[p],add[p]),ppd(R[p],mul[p],add[p]);
40     mul[p]=1,add[p]=0;
41 }
42 int merge(int x,int y){
43     if(!x||!y) return x+y;
44     pd(x),pd(y);
45     if(v[x]>v[y]) swap(x,y);
46     R[x]=merge(R[x],y);
47     if(d[L[x]]<d[R[x]]) swap(L[x],R[x]);
48     d[x]=d[R[x]]+1;return x;
49 }
50 void dfs(int u,int fa){
51     dep[u]=dep[fa]+1;
52     for(int i=head[u];i;i=Next[i]){int v=ver[i];dfs(v,u),rt[u]=merge(rt[u],rt[v]);}
53     while(rt[u]&&v[rt[u]]<h[u]){
54         pd(rt[u]);++ans1[u],ans2[rt[u]]=dep[c[rt[u]]]-dep[u];
55         rt[u]=merge(L[rt[u]],R[rt[u]]);
56     }
57     fl[u]?ppd(rt[u],val[u],0):ppd(rt[u],1,val[u]);
58 }
59 int main(){
60 //    freopen("testdata.in","r",stdin);
61     n=read(),m=read();
62     for(int i=1;i<=n;++i) h[i]=read();
63     for(int i=2;i<=n;++i){
64         int fa=read();fl[i]=read(),val[i]=read();
65         add_edge(fa,i);
66     }
67     for(int i=1;i<=m;++i){
68         v[i]=read(),c[i]=read();
69         mul[i]=1;
70         rt[c[i]]=merge(rt[c[i]],i);
71     }
72     dfs(1,0);
73     while(rt[1]) pd(rt[1]),ans2[rt[1]]=dep[c[rt[1]]],rt[1]=merge(L[rt[1]],R[rt[1]]);
74     for(int i=1;i<=n;++i) print(ans1[i]);
75     for(int i=1;i<=m;++i) print(ans2[i]);
76     Ot();
77     return 0;
78 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9806327.html

洛谷P3261 [JLOI2015]城池攻占(左偏树)相关推荐

  1. BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...

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

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

  3. 左偏树初步学习 洛谷P3377

    玩的有点多......睡的有点少... 左偏树是一种支持O(logn)的时间复杂度内进行合并的堆式数据结构. 定义: 外结点:左儿子或者右儿子是空结点的结点 距离:一个结点x的距离disx定义为其子树 ...

  4. 【洛谷3377】 左偏树(可并堆)

    前言 其实我是不小心翻线性基的时候看见的. Solution 左偏树只会模板,挖坑待补 代码实现 #include<stdio.h> #include<stdlib.h> #i ...

  5. 洛谷P3273 [SCOI2011] 棘手的操作 [左偏树]

    题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 ...

  6. 洛谷P4971:断罪者(左偏树)

    解析 看起来就是左偏树的基本操作啊- 然而就是调不过去 吐了qwq 参考了望月大神的实现 感觉清晰的多 就定义并查集维护的是每个点所在的堆的根节点 一下子少了很多恶心的套娃 代码 #include&l ...

  7. 【学习笔记】浅谈短小可爱的左偏树(可并堆)

    文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...

  8. 【BZOJ】1455 罗马游戏 左偏树

    题目传送门 这题和洛谷上的左偏树模板的解题思路是一模一样的,所以只要贴上左偏树的模板就好了. 附上AC代码: #include <cstdio> #include <cctype&g ...

  9. 左偏树(可并堆)初步及其应用

    作者:hsez_yyh 链接:左偏树(可并堆)初步及其应用_hsez_yyh的博客-CSDN博客 来源:湖北省黄石二中信息竞赛组        著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

最新文章

  1. xp系统蓝屏代码7b_电脑蓝屏重启不求人!学会这个方法,自己就能轻松解决!...
  2. Angular - - $sce 和 $sceDelegate
  3. day34 异常处理、断言、socket之ftp协议
  4. 学习设计模式 - 六大基本原则之单一职责原则
  5. SpringIOC容器中Bean的生命周期
  6. 从客户的角度看网站涉及的第一要素
  7. 透析阿里云视频云「低代码音视频工厂」之能量引擎——vPaaS视频原生应用开发平台
  8. 动图:程序员才懂的这些!
  9. python 熊猫,Python熊猫
  10. 如何使用JavaScript访问对象的键中有空格的对象?
  11. SWOOLE的热更新实现
  12. Echarts饼状图空心圆技巧 | 爱骇客 | 骇客
  13. 【音乐】后弦 - 笔墨侍候
  14. Pseudo-terminal will not be allocated because stdin is not a terminal
  15. SQL语法INSERT INTO_大数据培训
  16. centos7上安装Crucible教程及出现问题的解决
  17. 2020蓝桥杯python——纪念日
  18. Arcmap矢量数据的基础编辑
  19. mysql重启后应用也要重启_数据库重启后应用也必须重启
  20. 从优化角度推导主成分分析法(PCA)的数学原理

热门文章

  1. DNS 基础知识及 Linux DNS 服务器操作知识
  2. ELK logstash 处理MySQL慢查询日志
  3. 继承父类 , 实现接口 时, 方法的权限
  4. 【Spark】sparksql中使用自定义函数
  5. A. 解决运行php文件出现乱码的问题
  6. RK3288开发过程中遇到的问题点和解决方法之Packages
  7. 小解系列-解决WebUploader在谷歌浏览器下弹出框打开慢,在Bootstrap模态框内部多次点击才能触发的问题
  8. .netFramework 升级NetCore 问题汇总及解决方案
  9. IOS 10 微信 ajax readystate=0 status=0 解决方法
  10. chrome浏览器 提示Adobe Flash Player未安装的解决方法