BZOJ 4003 【JLOI2015】城池攻占
Description
小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池。
Input
第 1 行包含两个正整数 n;m,表示城池的数量和骑士的数量。
Output
输出 n + m 行,每行包含一个非负整数。其中前 n 行分别表示在城池 1 到 n 牺牲的骑士
Sample Input
50 20 10 10 30
1 1 2
2 0 5
2 0 -10
1 0 10
20 2
10 3
40 4
20 4
35 5
Sample Output
2
0
0
0
1
1
3
1
1
HINT
对于 100% 的数据,1 <= n;m <= 300000; 1 <= fi<i; 1 <= ci <= n; -10^18 <= hi,vi,si <= 10^18;ai等于1或者2;当 ai =1 时,vi > 0;保证任何时候骑士战斗力值的绝对值不超过 10^18。
这道题一眼看去显然是一道数据结构题。然后就考虑一下用什么东西来维护。
考虑我们需要一些什么操作。由于每个节点可能有多个骑士,每次都要把不符合条件的骑士踢出去,于是需要查询最小值。由于需要改变能力值,于是需要打标记。由于需要往上合并,需要支持合并。
然后,这不就是个可并堆吗!左偏树什么的随便写一写就可以过。
PS:弹出堆顶的时候不要忘记把堆顶节点标记下传!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 300010 using namespace std;
typedef long long llg; struct data{
llg x,ch,jia;
data(llg a=,llg bb=,llg c=):x(a),ch(bb),jia(c){}
void gi(){x=jia=;ch=;}
bool operator < (const data &h)const{return x<h.x;}
}ss[maxn];
int rt[maxn],s[maxn][],gua[maxn],ci[maxn],dep[maxn];
int n,m,head[maxn],next[maxn],to[maxn],tt,dis[maxn];
llg h[maxn],a[maxn]; bool w[maxn]; void pushdown(int u){
int l=s[u][],r=s[u][];
if(ss[u].ch!=){
ss[l].x*=ss[u].ch; ss[r].x*=ss[u].ch;
ss[l].ch*=ss[u].ch; ss[r].ch*=ss[u].ch;
ss[l].jia*=ss[u].ch; ss[r].jia*=ss[u].ch;
}
if(ss[u].jia){
ss[l].x+=ss[u].jia; ss[r].x+=ss[u].jia;
ss[l].jia+=ss[u].jia; ss[r].jia+=ss[u].jia;
}
ss[u].jia=; ss[u].ch=; ss[].gi();
} int merge(int a,int b){
if(!a || !b) return a+b;
if(ss[b]<ss[a]) swap(a,b);
pushdown(a);
s[a][]=merge(s[a][],b);
if(dis[s[a][]]>dis[s[a][]]) swap(s[a][],s[a][]);
dis[a]=dis[s[a][]]+; return a;
} void dfs(int u){
for(int i=head[u];i;i=next[i])
dfs(to[i]),rt[u]=merge(rt[u],rt[to[i]]);
int nn=rt[u];
while(nn && ss[nn].x<h[u]){
gua[u]++; ci[nn]-=dep[u]; pushdown(nn);
nn=rt[u]=merge(s[nn][],s[nn][]);
}
if(nn){
if(!w[u]) ss[nn].x+=a[u],ss[nn].jia+=a[u];
else ss[nn].x*=a[u],ss[nn].ch*=a[u],ss[nn].jia*=a[u];
}
} int main(){
scanf("%d %d",&n,&m); dep[]=; dis[]=-;
for(int i=;i<=n;i++) scanf("%lld",&h[i]);
for(int i=,x,xx;i<=n;i++){
scanf("%d %d %lld",&x,&xx,&a[i]);
w[i]=xx; dep[i]=dep[x]+;
to[++tt]=i;next[tt]=head[x];head[x]=tt;
}
for(int i=,u;i<=m;i++){
scanf("%lld %d",&ss[i].x,&u);
ss[i].ch=; ci[i]=dep[u];
if(!rt[u]) rt[u]=i;
else rt[u]=merge(rt[u],i);
}
dfs();
for(int i=;i<=n;i++) printf("%d\n",gua[i]);
for(int i=;i<=m;i++) printf("%d\n",ci[i]);
return ;
}
BZOJ 4003 【JLOI2015】城池攻占的更多相关文章
- BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...
- bzoj 4003 [JLOI2015]城池攻占 —— 左偏树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子 ...
- BZOJ 4003 JLOI2015 城池攻占
做法和APIO2012派遣 那道题目类似 在树上DFS,维护当前子树的小根堆 因为需要合并孩子们的信息,使用左偏树就可以了 每次弹出死亡骑士,对剩余骑士打上奖励标记 至于标记的下传和更改,只需要每次在 ...
- BZOJ_4003_[JLOI2015]城池攻占_可并堆
BZOJ_4003_[JLOI2015]城池攻占_可并堆 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 ...
- 【BZOJ4003】[JLOI2015]城池攻占 可并堆
[BZOJ4003][JLOI2015]城池攻占 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号 ...
- Luogu 3261 [JLOI2015]城池攻占
BZOJ 4003 需要实现一个可并堆. 每个点维护一个小根堆,然后一开始把所有骑士加入到它所在的点的小根堆当中,实际上空间是$O(m)$的,然后我们从上到下不断合并这个小根堆,合并完之后如果遇到堆顶 ...
- [bzoj4003][JLOI2015]城池攻占_左偏树
城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城 ...
- [洛谷P3261] [JLOI2015]城池攻占(左偏树)
不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...
- BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)
左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...
- BZOJ4003:[JLOI2015]城池攻占——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 https://www.luogu.org/problemnew/show/P3261 小铭 ...
随机推荐
- 【代码笔记】iOS-利用图片序列创建动态图片效果
一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...
- 【读书笔记】iOS-使用Web Service-基于客户端服务器结构的网络通信(一)
Web Service技术是一种通过Web协议提供服务,保证不同平台的应用服务可以互操作,为客户端程序提供不同的服务. 目前3种主流的Web Service实现方案用:REST,SOAP和XML-RP ...
- ORACLE 10g AWR报告设置总结
1:查看.修改AWR报告快照数据的采样间隔.保存策略 SQL> COL DBID FOR 999999999999 SQL> COL SNAP_INTERVAL FOR A26 SQL ...
- mysql metadata lock(二)
上一篇<mysql metadata lock(一)>介绍了为什么引入MDL,MDL作用以及MDL锁导致阻塞的几种典型场景,文章的最后还留下了一个小小的疑问.本文将更详细的介绍MDL,主要 ...
- 创建一个Point类,有成员变量x,y,方法getX(),setX(),还有一个构造方 法初始化x和y。创建类主类A来测试它
package com.hanqi.test; public class Point { private int x; private int y; Point(int xx,int yy) { x= ...
- .NET领域驱动设计—看DDD是如何运用设计模式颠覆传统架构
阅读目录: 1.开篇介绍 2.简单了解缘由(本文的前期事宜) 3.DomainModel扩展性(运用设计模式设计模型变化点) 3.1.模型扩展性 3.2.设计模式的使用(苦心专研的设计模式.设计思想可 ...
- 浅谈游标选项 Static|Keyset|DYNAMIC|FAST_FORWARD
接好久之前太监的一篇Blog.现在补充几个选项的介绍 所用的语句都是这个 IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1 GO CREATE TABLE T1 ...
- MySQL基础学习(二) 常用SQL命令
一. 1. select version(); 查看数据库版本 2. select user(); 查看当前用户 3. select now(); 查看当前时间 4. show databases; ...
- dpdk在虚拟机上出错处理
目录 1. 所用系统与软件版本 2. 虚拟机配置 3. Ubuntu 12.04上的配置 3.1 准备 3.2 通过setup脚本进行配置 3.3 通过命令配置 4. CentOS 7.0上的配置 4 ...
- Linux信号类型说明
说明 在Linux系统开发中经常要使用到信号来实现异步通知机制.而在Linux系统中信号有很多种,也不用全部记住,学习几种常见的信号,学会使用即可:当然也要知道用哪种方式能够发送这样的信号. 查看li ...