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 小铭 ...
随机推荐
- JavaScript Patterns 5.5 Sandbox Pattern
Drawbacks of the namespacing pattern • Reliance on a single global variable to be the application’s ...
- win8.1 user profile service 服务登录失败
在Win 8.1 上新建个用户后,不能登录. 出现 user profile service 服务登录失败. 无法加载用户配置文件. 网上大部分相同提示的问题是有关已有账号不能再次登陆的. 解决方式是 ...
- boneCP原理研究
** 转载请注明源链接:http://www.cnblogs.com/wingsless/p/6188659.html boneCP是一款关注高性能的数据库连接池产品 github主页 . 不过最近作 ...
- 【Oracle XE系列之一】Windows10_X64环境 安装Oracle XE11gR2 X64数据库
一.安装 1.去Oracle官网下载XE版的安装包[下载路径](Oracle Database Express Edition 11g Release 2 for Windows x64),解压. 2 ...
- 数据结构杂谈(二)简单有趣的地精排序Gnome sort
很早之前便听说过地精排序的名字,今天自己看来一下,发现这是一种非常简单而且有趣的排序算法. 为什么叫地精排序? 地精排序在2000年由Dr. Hamid Sarbazi-Azad 提出的时候被称作 s ...
- x01.os.14: 时间都去哪儿了
时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹 ...
- C语言中链表任意位置怎么插入数据?然后写入文件中?
链表插入示意图:(图是个人所画)因为链表指针指来指去,难以理解,所以辅助画图更加方便. 插入某个学号后面图: 定义的结构体: struct student { ]; //学生学号 ]; //学生姓名 ...
- 通过SecureCRT访问亚马逊Amazon EC2主机
亚马逊推出了免费的云主机服务器 Amazon EC2,它是通过安全密钥来访问主机的. 问题是下载的密钥在SecureCRT 上无法直接使用,需要转换. 下面的方法可以在自己的linux主机上生成sec ...
- 清除MAC OS X上的流氓软件 - advance mac cleaner
自3721开天辟地以来,流氓软件从来就没有消停过,连MAC OS X都难逃流氓软件的骚扰. 近日,因为从SourceForge上下载了一个软件安装包,结果中招了——莫名其妙被安装了advance ma ...
- 谈谈Lucene和Solr索引存目录
在Lucene中,有几种索引存放模式呢?用过的人可能记得SimpleFSDirectory.MMapDirectory.NIOFSDirectory.RAMDirectory这四种.新版本的通过FSD ...