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开发之多线程技术
本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...
- Http协议与TCP协议简单理解
TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...
- .Net Core 之 Ubuntu 14.04 部署过程
No.1 准备应用程序 1. 创建.Net Core Web项目 2. 使用VS2015发布 No.2 安装.Net Core for Ubuntu Ubuntu的安装就不介绍了,百度搜索一大堆.本人 ...
- WPF学习之路(十二)控件(Items控件)
ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...
- ORACLE关于索引是否需要定期重建争论的整理
ORACLE数据库中的索引到底要不要定期重建呢? 如果不需要定期重建,那么理由是什么? 如果需要定期重建,那么理由又是什么?另外,如果需要定期重建,那么满足那些条件的索引才需要重建呢?关于这个问题,网 ...
- Linux 僵尸进程查杀
僵尸进程概念 僵尸进程(Zombie process)通俗来说指那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 书面形式一点:一个进程结束了,但是他的父进程没有等待(调用wait ...
- myBatis系列之四:关联数据的查询
myBatis系列之三:增删改查是基于单表的查询,如果联表查询,返回的是复合对象,需要用association关键字来处理. 如User发表Article,每个用户可以发表多个Article,他们之间 ...
- Linux Gitlab
一.简介 GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源 ...
- [引] Security tips for web developers
Source :Security tips for web developers
- Hadoop 基准测试与example
#pi值示例 hadoop jar /app/cdh23502/share/hadoop/mapreduce2/hadoop-mapreduce-examples--cdh5. #生成数据 第一个参数 ...