JLOI2015 城池攻占
题目描述
题解:
将所有骑士放在$ci$上,然后树上$dfs$。
每个节点维护一个小根堆,一直$pop$直到$top>=hi$。
然后放加法、乘法标记,将剩下的骑士回溯带回父节点。
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int N = 300050; template<typename T> 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]]<dis[rs[x]])swap(ls[x],rs[x]);dis[x] = dis[rs[x]]+1;return x; } int pop(int x) {pushdown(x);return merge(ls[x],rs[x]); } int dep[N]; int a1[N],a2[N]; void dfs(int u) {dep[u] = dep[f[u]]+1;for(int j=hed[u];j;j=e[j].nxt){int to = e[j].to;dfs(to);rt[u]=merge(rt[u],rt[to]);}while(rt[u]&&s[rt[u]]<h[u]){a1[u]++;a2[rt[u]]=dep[c[rt[u]]]-dep[u];rt[u]=pop(rt[u]);}if(!a[u])add(rt[u],v[u]);else mul(rt[u],v[u]); } int main() {read(n),read(m);for(int i=1;i<=n;i++)read(h[i]);h[0]=10000000000000008ll;ae(0,1);for(int i=2;i<=n;i++)read(f[i]),read(a[i]),read(v[i]),ae(f[i],i);for(int i=1;i<=m;i++)read(s[i]),read(c[i]),tag_m[i]=dis[i]=1,rt[c[i]]=merge(rt[c[i]],i);dfs(0);for(int i=1;i<=n;i++)printf("%d\n",a1[i]);for(int i=1;i<=m;i++)printf("%d\n",a2[i]);return 0; }
转载于:https://www.cnblogs.com/LiGuanlin1124/p/10294917.html
JLOI2015 城池攻占相关推荐
- [bzoj4003][JLOI2015]城池攻占_左偏树
城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城 ...
- 【左偏树】【P3261】 [JLOI2015]城池攻占
Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其 ...
- 洛谷P3261 [JLOI2015]城池攻占(左偏树)
传送门 每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上 然后开始dfs,每一次把子树里那些还活着的骑士合并上来 然后再考虑当前点的堆,一直pop直到骑士全死光或者剩下的 ...
- BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...
- P3261-[JLOI2015]城池攻占【左偏树】
正题 题目链接:https://www.luogu.com.cn/problem/P3261 题目大意 nnn个点的树,每个节点有一个防御值和一个攻击后的影响(让你的伤害加上一个数或者乘上一个数) 然 ...
- JLOI2015 解题报告
JLOI2015 真的不愧是NOI出题组出的,题目难度够吊.不过每一道都是结论题和乱搞题真的很不好玩... T1:[JLOI2015]有意义的字符串 首先贴下popoqqq的blog吧 感性的认识就是 ...
- 【学习笔记】浅谈短小可爱的左偏树(可并堆)
文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
- ipad分屏功能怎么开启_率土之滨叫阵功能怎么出现的 开启叫阵方法一览
率土之滨是一款战争策略类游戏,在游戏中它的玩法也是在不断的创新的,其中比较有意思的是在率土之滨中两军交战时是可以开启弹幕进行叫阵的,那么率土之滨叫阵功能怎么出现的呢?下面我们一起来看一下吧. 如何打开 ...
最新文章
- 增大模型依然有用,DeepMind用2800亿参数的Gopher,测试语言系统极限
- Django系列教程:三、动态视图和动态Url
- 大道至简第三章读后感
- ubuntu deepin python/python3安装pip/pip3
- Python+Opencv颜色和形状检测
- 【python】面向对象的封装、继承、多态的练习题
- 为什么专业工程师对前端开发不屑一顾?
- ado.net mysql 转义_ADO.NET数据库查询
- redismanager 获取不到yml中的密码_恋爱物语APP:在城市的孤独中,获取真爱密码...
- C语言编写学生管理系统
- 开源软件清除了“开源”和“商业”之间的障碍——商业软件、开源软件和自由软件的区别
- error: Microsoft Visual C++ 14.0 is required. Get it with “Build Tools for Visual Studio“: https://
- Linux XFS文件系统修复
- Soft Cosine Measure
- 实现74LVC161的计数器功能
- 你们都以落第为耻,我却以落第动心为耻
- 网络分析仪E5071C 使用
- 卸载 HI 英文输入法( InputHelp )
- 私钥,公钥,钱包地址,助记词,keyStore的区别
- round在python是什么意思_细说python中的round()方法
热门文章
- mysql没有group by_MySQL:不在GROUP BY中
- 给定奇数、横、竖、斜、总和相等python_第四章练习
- linux搜索命令有哪些,linux五大搜索命令学习
- java 反射 静态成员_java 利用反射获取内部类静态成员变量的值
- linux内核添加模块,linux中添加内核模块
- 什么是SQL Server TRIM()函数?
- scala切片_Scala切片功能
- tcp协议和udp协议区别_TCP和UDP协议有什么区别?
- AppBarLayout中的Android TabLayout
- Android ProgressDialog示例