题目

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);}
}

【单调队列】恐怖的奴隶主相关推荐

  1. 单调队列多重背包时间复杂度O(vn)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 多重背包问题: 有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件.怎样装才能使背包内的物品总价值最大? 网 ...

  2. 洛谷 P2219修筑绿化带 二维单调队列~

    题目链接:https://www.luogu.org/problem/P2219 emmm调了一个上午+中午,fan 题意:从N*M的中找到一个a*b的大矩形和减去a*b中的一个与之不重边界的c*d的 ...

  3. P2216 理想的正方形 单调队列 (二维)

    题目链接:https://www.luogu.org/problem/P2216 题意:求给定n*m的矩形中所有k*k的正方形块中最大值最小值之差(极差)最小 哇,大神的思路真的很帅 单调队列对每一行 ...

  4. 点分治问题 ----------- luoguP2942 [WC2010]重建计划 [点分治 + bfs + 单调队列 + 预处理建树 + 二分 + 01分数规划]

    题目链接 解题思路: 1.对于这个Avgvalue=∑e∈sv(e)∣s∣Avgvalue = \frac{\sum_{e\in s}v(e)}{|s|}Avgvalue=∣s∣∑e∈s​v(e)​ ...

  5. 解题报告:Fake Maxpooling(单调队列求矩阵的和)

    我们不妨先把这个问题中二维的矩阵简化成一维的数列.那么现在的问题就变成了一个求连续的滑动窗口最值问题:给出一个长度为n的数列和一个长度为k(k<n)的窗口,记录滑动窗口位于每个位置下的下的最大值 ...

  6. 0x12.基本数据结构 — 队列与单调队列

    目录 一.队列 0.UVA540 团体队列 Team Queue 1.AcWing 133. 蚯蚓(模拟优先队列) 二 .单调队列 0.AcWing 135. 最大子序和(单调队列) 1.luogu ...

  7. 【题解】P1419 寻找段落(二分+单调队列)难度⭐⭐⭐★

    P1419 寻找段落 首先二分答案,即:二分最大平均值. 我们将a全部减去mid,问题转化为判断是否存在一个长度在s~t范围内的区间它的和为正,如果有说明还有更大的平均值. 用前缀和和单调队列维护. ...

  8. 【数据结构】单调栈和单调队列 详解+例题剖析

    算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...

  9. HDU 5289 Assignment(单调队列)

    题意:给T足数据,然后每组一个n和k,表示n个数,k表示最大同意的能力差,接下来n个数表示n个人的能力,求能力差在k之内的区间有几个 分析:维护一个区间的最大值和最小值,使得他们的差小于k,于是採用单 ...

最新文章

  1. python3 列表的增删改查
  2. 在ListView中使用BaseAdapter进行适配
  3. C++Rabin Karp算法字符串快速查找(附完整源码)
  4. Tomcat的Session管理(三)
  5. php 字母数字混合排序,JavaScript_基于JS实现数字+字母+中文的混合排序方法,在上篇文章给大家介绍了JavaScr - phpStudy...
  6. centos7 安装nginx报错./configure: error: the HTTP rewrite module requires the PCRE library
  7. 活动合作 | 2018GAITC大会:AI领袖、应用指南、窥见风口,还能从中获得更多
  8. express 模板 及 文件上传
  9. Mybatis框架(复杂动态SQL),一对一,一对多,多对多
  10. 从 阿西莫夫机器人三大定律 谈起
  11. C++中清理map的代码
  12. 【深入理解JS核心技术】1.在 JavaScript 中创建对象的可能方式有哪些?
  13. 对JavaScript中 this 关键词的理解
  14. 普罗米修斯清除历史数据
  15. 【转】Ouroboros:一个可证明安全的PoS区块链协议 (共识介绍)
  16. 微信小程序 还在为滑动加载数据烦劳吗? 封装滚动加载方法 看了就会
  17. JavaWEB(applicationjavabean封装)
  18. 关于no ‘read’ permission
  19. BUU刷题记录(四)
  20. [LLVM教程]LLVM之第一个语言前端

热门文章

  1. windows系统命令 findstr
  2. 实验四 获取C程序中一个逻辑地址对应的物理地址
  3. 2011.12黄金城道上的小资茶坊
  4. 频谱细化-----CZT算法介绍及MATLAB实现
  5. rt-thread的moudle源码分析
  6. illegal cyclic inheritance involving trait Iterable val wordRDD: RDD[String] = fileRDD.flatMap(
  7. 【java nio】Selector 原理解析
  8. java现实图片头像抓取
  9. Springboot短信防刷接口实现及Dubbo、Zookeeper整合
  10. vue3使用provide/inject实现全局变量功能,部分摆脱vuex