【单调队列】恐怖的奴隶主
题目
Description
在《炉石传说》这款游戏中,有一张随从卡牌叫做“恐怖的奴隶主”。这张卡牌的描述是这样的:每当该随从受到伤害且没有死亡,召唤另一个恐怖的奴隶主。还有一张卡牌叫做“旋风斩”,描述是“对所有随从造成1点伤害”。使用“旋风斩”后,生命值变为0的“恐怖的奴隶主”并不会立即死亡,而会先结算召唤新的“恐怖的奴隶主”再结算生命值为0的“恐怖的奴隶主”的死亡。当然,使用旋风斩后,生命值变为0的“恐怖的奴隶主”不会召唤新的“恐怖的奴隶主”。随从的数量是有上限的,在召唤一个随从前如果随从数量已经达到上限则不会召唤。现在,如果随从数量上限为k,最开始只有一个生命值为m的“恐怖的奴隶主”,而且新召唤出来的“恐怖的奴隶主”的生命值也是m,那么使用了n张“旋风斩”后还有多少个“恐怖的奴隶主”呢?
Input
输入共一行包含3个正整数n, m, k。
Output
输出共一行包含1个整数,表示使用n张旋风斩后“恐怖的奴隶主”的数量。
Sample Input
4 3 7
Sample Output
6
【样例说明】
初始有1个生命值为3的“恐怖的奴隶主”。
第1次旋风斩后,召唤了1个“恐怖的奴隶主”,剩余1个生命值为2的和1个生命值为3的。
第2次旋风斩后,召唤了2个“恐怖的奴隶主”,剩余1个生命值为1的、1个生命值为2的和2个生命值为3的。
第3次旋风斩后,召唤了3个“恐怖的奴隶主”,然后1个生命值为0的死亡,剩余1个生命值为1的、2个生命值为2的和3个生命值为3的。
第4次旋风斩后,试图召唤5个“恐怖的奴隶主”,但随从数量达到上限7,所以只召唤了1个,然后其中1个生命值为0的死亡,最后剩余2个生命值为1的、3个生命值为2的和1个生命值为3的,共6个。
Data Constraint
对于10%的数据,n,k<=10^3;
另有15%的数据,n,m<=10^5;
另有25%的数据,m<=10^5;
另有20%的数据,108<=n,m,k<=109;
对于全部数据,n,m,k<=10^15。
思路
使用一个队列,记录每种数有多少个,初始时有 1 个 1 和 m - 1 个 0,每次操作 O(1)更新。
注意到队列中大部分(连续的一段)是 0,所以可以将它们合并、用某种方式表示,例如如果有连续 x 个 0 就在队列中存-x。这样有时候可以 O(1)地操作 x 次。可以证明,队列中有至少 m - O(log k)个连续的 0。
代码
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
const int maxn=1077;
ll n,m,k,pos,s[maxn],f[maxn];
int main()
{scanf("%lld%lld%lld",&n,&m,&k);if(m==1){printf("0"); return 0;}f[0]=s[0]=1;for(int i=1; i<=n; i++){f[i]=min(k-s[i-1],s[i-1]-((i>=m)?f[i-m]:0));s[i]=s[i-1]+f[i]-((i>=m)?f[i-m]:0);if(f[i]+s[i-1]==k){pos=i; break;}}if(!pos) printf("%lld",s[n]);else{n%=(m+1);if(n<=pos) n+=m+1;if(n-m>=0) printf("%lld\n",k-f[n-m]);else printf("%lld\n",k);}
}
【单调队列】恐怖的奴隶主相关推荐
- 单调队列多重背包时间复杂度O(vn)
版权声明:本文为博主原创文章,未经博主允许不得转载. 多重背包问题: 有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件.怎样装才能使背包内的物品总价值最大? 网 ...
- 洛谷 P2219修筑绿化带 二维单调队列~
题目链接:https://www.luogu.org/problem/P2219 emmm调了一个上午+中午,fan 题意:从N*M的中找到一个a*b的大矩形和减去a*b中的一个与之不重边界的c*d的 ...
- P2216 理想的正方形 单调队列 (二维)
题目链接:https://www.luogu.org/problem/P2216 题意:求给定n*m的矩形中所有k*k的正方形块中最大值最小值之差(极差)最小 哇,大神的思路真的很帅 单调队列对每一行 ...
- 点分治问题 ----------- luoguP2942 [WC2010]重建计划 [点分治 + bfs + 单调队列 + 预处理建树 + 二分 + 01分数规划]
题目链接 解题思路: 1.对于这个Avgvalue=∑e∈sv(e)∣s∣Avgvalue = \frac{\sum_{e\in s}v(e)}{|s|}Avgvalue=∣s∣∑e∈sv(e) ...
- 解题报告:Fake Maxpooling(单调队列求矩阵的和)
我们不妨先把这个问题中二维的矩阵简化成一维的数列.那么现在的问题就变成了一个求连续的滑动窗口最值问题:给出一个长度为n的数列和一个长度为k(k<n)的窗口,记录滑动窗口位于每个位置下的下的最大值 ...
- 0x12.基本数据结构 — 队列与单调队列
目录 一.队列 0.UVA540 团体队列 Team Queue 1.AcWing 133. 蚯蚓(模拟优先队列) 二 .单调队列 0.AcWing 135. 最大子序和(单调队列) 1.luogu ...
- 【题解】P1419 寻找段落(二分+单调队列)难度⭐⭐⭐★
P1419 寻找段落 首先二分答案,即:二分最大平均值. 我们将a全部减去mid,问题转化为判断是否存在一个长度在s~t范围内的区间它的和为正,如果有说明还有更大的平均值. 用前缀和和单调队列维护. ...
- 【数据结构】单调栈和单调队列 详解+例题剖析
算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...
- HDU 5289 Assignment(单调队列)
题意:给T足数据,然后每组一个n和k,表示n个数,k表示最大同意的能力差,接下来n个数表示n个人的能力,求能力差在k之内的区间有几个 分析:维护一个区间的最大值和最小值,使得他们的差小于k,于是採用单 ...
最新文章
- python3 列表的增删改查
- 在ListView中使用BaseAdapter进行适配
- C++Rabin Karp算法字符串快速查找(附完整源码)
- Tomcat的Session管理(三)
- php 字母数字混合排序,JavaScript_基于JS实现数字+字母+中文的混合排序方法,在上篇文章给大家介绍了JavaScr - phpStudy...
- centos7 安装nginx报错./configure: error: the HTTP rewrite module requires the PCRE library
- 活动合作 | 2018GAITC大会:AI领袖、应用指南、窥见风口,还能从中获得更多
- express 模板 及 文件上传
- Mybatis框架(复杂动态SQL),一对一,一对多,多对多
- 从 阿西莫夫机器人三大定律 谈起
- C++中清理map的代码
- 【深入理解JS核心技术】1.在 JavaScript 中创建对象的可能方式有哪些?
- 对JavaScript中 this 关键词的理解
- 普罗米修斯清除历史数据
- 【转】Ouroboros:一个可证明安全的PoS区块链协议 (共识介绍)
- 微信小程序 还在为滑动加载数据烦劳吗? 封装滚动加载方法 看了就会
- JavaWEB(applicationjavabean封装)
- 关于no ‘read’ permission
- BUU刷题记录(四)
- [LLVM教程]LLVM之第一个语言前端
热门文章
- windows系统命令 findstr
- 实验四 获取C程序中一个逻辑地址对应的物理地址
- 2011.12黄金城道上的小资茶坊
- 频谱细化-----CZT算法介绍及MATLAB实现
- rt-thread的moudle源码分析
- illegal cyclic inheritance involving trait Iterable val wordRDD: RDD[String] = fileRDD.flatMap(
- 【java nio】Selector 原理解析
- java现实图片头像抓取
- Springboot短信防刷接口实现及Dubbo、Zookeeper整合
- vue3使用provide/inject实现全局变量功能,部分摆脱vuex