博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JLOI2015 城池攻占
阅读量:4518 次
发布时间:2019-06-08

本文共 1250 字,大约阅读时间需要 4 分钟。

题解:

将所有骑士放在$ci$上,然后树上$dfs$。

每个节点维护一个小根堆,一直$pop$直到$top>=hi$。

然后放加法、乘法标记,将剩下的骑士回溯带回父节点。

代码:

#include
#include
#include
using namespace std;typedef long long ll;const int N = 300050;template
inline void read(T&x){ T f = 1,c = 0;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();} x = f*c;}int n,m,f[N],hed[N],cnt;ll h[N],a[N],v[N],s[N],c[N],tag_p[N],tag_m[N];int dis[N],ls[N],rs[N];int rt[N];struct EG{ int to,nxt;}e[N];void ae(int f,int t){ e[++cnt].to = t; e[cnt].nxt = hed[f]; hed[f] = cnt;}void add(int x,ll d){ if(!x)return ; tag_p[x]+=d; s[x]+=d;}void mul(int x,ll d){ if(!x)return ; tag_m[x]*=d; tag_p[x]*=d; s[x]*=d;}void pushdown(int x){ if(tag_m[x]!=1) { mul(ls[x],tag_m[x]); mul(rs[x],tag_m[x]); tag_m[x] = 1; } if(tag_p[x]) { add(ls[x],tag_p[x]); add(rs[x],tag_p[x]); tag_p[x] = 0; }}int merge(int x,int y){ if(!x||!y)return x+y; if(s[x]>s[y])swap(x,y); pushdown(x); rs[x] = merge(rs[x],y); if(dis[ls[x]]

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10294917.html

你可能感兴趣的文章
python3-day5(模块)
查看>>
Linux配置JDK
查看>>
qt 读取xml文件
查看>>
python3之正则表达式
查看>>
Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
查看>>
Java 时间总结
查看>>
JavaScript 累加求和练习
查看>>
jQuery EasyUI 拖放 – 基本的拖动和放置
查看>>
计算累进税类问题
查看>>
ThinkInJava之内部类
查看>>
licode学习之erizo篇--WebrtcConnection
查看>>
动态规划——背包问题汇总
查看>>
iOS 日历提醒 (类似天猫淘宝的 利用代码添加事件到系统日历中)
查看>>
福大软工1816 · 第一次作业 - 准备
查看>>
[原创]浅谈移动互联网创业公司工具类产品
查看>>
composer查看安装情况
查看>>
操作系统概述
查看>>
前端组件,框架,以及模板
查看>>
实现带有getMin的栈
查看>>
这些年正Android - 母亲
查看>>