最新要闻
- 日本国产大飞机研发失败:研发耗时十余年
- 当前视讯!大批《LOL》玩家逃离国服挤爆台服 拳头调查处理中
- 头条:为何突然爆红网络?小胖俞涛回应“九转大肠梗” 吃起来确实酸爽
- 【环球报资讯】天马认领:独家供应一加Ace 2 1.5K灵犀触控屏
- 通讯!0糖0脂0卡 三种口味 哪吒气泡水1.66元/瓶史底
- 世界今亮点!逆天!男子称在国美买家电两年没到货 花费超两万
- 全球热消息:影驰首次涉足游戏显示器:27寸2K屏、165Hz高刷
- 奔驰史诗级调整:19款车将停产!不挣钱的不要
- 世界热门:宁德时代两大杀手级新品电池正式来了:新能源汽车市场要变天?
- 14.9mm纤薄机身惊艳:联想小新Air 14 2023烟霞紫亮相
- 观热点:1099元起 真我推出V30/V30t新机:天玑700入门U
- 环球热点评!3月1日上线全国外卖服务?抖音回应:无具体时间表
- 《GTA5》母公司T2 CEO:ChatGPT等AI将提高游戏行业的标准
- 业界功率最高!一加27W冰点散热背夹发布 219元
- 蔚来:自家充电桩仅24%时间给蔚来充电 比亚迪、特斯拉用爽了
- 世界微资讯!ChatGPT幕后创始人拿微软100亿 是在下一步大棋
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
快消息!E. Monsters (hard version)
E. Monsters (hard version)
This is the hard version of the problem. In this version, you need to find the answer for every prefix of the monster array.
(资料图片仅供参考)
In a computer game, you are fighting against $n$ monsters. Monster number $i$ has $a_i$ health points, all $a_i$ are integers. A monster is alive while it has at least $1$ health point.
You can cast spells of two types:
- Deal $1$ damage to any single alive monster of your choice.
- Deal $1$ damage to all alive monsters. If at least one monster dies (ends up with $0$ health points) as a result of this action, then repeat it (and keep repeating while at least one monster dies every time).
Dealing $1$ damage to a monster reduces its health by $1$.
Spells of type 1 can be cast any number of times, while a spell of type 2 can be cast at most once during the game.
For every $k = 1, 2, \ldots, n$, answer the following question. Suppose that only the first $k$ monsters, with numbers $1, 2, \ldots, k$, are present in the game. What is the smallest number of times you need to cast spells of type 1 to kill all $k$ monsters?
Input
Each test contains multiple test cases. The first line contains the number of test cases $t$ ($1 \le t \le 10^4$). The description of the test cases follows.
Each test case consists of two lines. The first line contains a single integer $n$ ($1 \le n \le 2 \cdot 10^5$) — the number of monsters.
The second line contains $n$ integers $a_1, a_2, \ldots, a_n$ ($1 \le a_i \le n$) — monsters" health points.
It is guaranteed that the sum of $n$ over all test cases does not exceed $2 \cdot 10^5$.
Output
For each test case, print $n$ integers. The $k$-th of these integers must be equal to the smallest number of times you need to cast spells of type 1 to kill all $k$ monsters, if only monsters with numbers $1, 2, \ldots, k$ are present in the game.
Example
input
233 1 264 1 5 4 1 1
output
2 1 03 2 4 4 4 4
Note
In the first test case, for $k = n$, the initial health points of the monsters are $[3, 1, 2]$. It is enough to cast a spell of type 2:
- Monsters" health points change to $[2, 0, 1]$. Since monster number $2$ dies, the spell is repeated.
- Monsters" health points change to $[1, 0, 0]$. Since monster number $3$ dies, the spell is repeated.
- Monsters" health points change to $[0, 0, 0]$. Since monster number $1$ dies, the spell is repeated.
- Monsters" health points change to $[0, 0, 0]$.
Since it is possible to use no spells of type 1 at all, the answer is $0$.
In the second test case, for $k = n$, the initial health points of the monsters are $[4, 1, 5, 4, 1, 1]$. Here is one of the optimal action sequences:
- Using a spell of type 1, deal $1$ damage to monster number $1$. Monsters" health points change to $[3, 1, 5, 4, 1, 1]$.
- Using a spell of type 1, deal $1$ damage to monster number $4$. Monsters" health points change to $[3, 1, 5, 3, 1, 1]$.
- Using a spell of type 1, deal $1$ damage to monster number $4$ again. Monsters" health points change to $[3, 1, 5, 2, 1, 1]$.
- Use a spell of type 2:
- Monsters" health points change to $[2, 0, 4, 1, 0, 0]$. Since monsters number $2$, $5$, and $6$ die, the spell is repeated.
- Monsters" health points change to $[1, 0, 3, 0, 0, 0]$. Since monster number $4$ dies, the spell is repeated.
- Monsters" health points change to $[0, 0, 2, 0, 0, 0]$. Since monster number $1$ dies, the spell is repeated.
- Monsters" health points change to $[0, 0, 1, 0, 0, 0]$.
- Using a spell of type 1, deal $1$ damage to monster number $3$. Monsters" health points change to $[0, 0, 0, 0, 0, 0]$.
Spells of type 1 are cast $4$ times in total. It can be shown that this is the smallest possible number.
解题思路
先说简单版C. Monsters (easy version)的做法。
在所有的选择方案中,对于在第二种攻击之后存在若干次第一种攻击的方案,我们总是可以把剩下的第一种攻击提前到第二种攻击之前。对于第二次攻击结束后还剩下血量的怪物,只能使用第一种攻击将其变成$0$,而如果我们在第二种攻击之前提前对这些还剩血量的怪物使用剩下的第一种攻击,由于第二种攻击对所有怪兽造成的伤害不变,所以在第二种攻击后这些怪物的血量就会变成$0$,并且第一种攻击的次数不会变多。
所以现在我们要如何安排第一次攻击,使得最后的第二种攻击能够一次性消灭所有的怪物?由于攻击与怪物的排列顺序无关,因此假设现在数组$a$(怪物血量)是升序排序的,通过若干次的第一种攻击后变成数组$a"$(依然升序)。很明显如果想让第二种攻击一次性将数组清零,那么$a"$中任意相邻的两个元素的差值不能超过$1$,因为如果存在某个相邻的元素$a_{i}^{"}-a_{i-1}^{"} \geq 2$(假设是满足这个条件的最小的$i$),那么当$i-1$被消灭,$i$前面的怪兽血量都已经清零,并且剩下的怪兽($i$之后)都已经损失了$a_{i-1}^{"}$的血量,此时$i$是所有剩下的怪物中血量最小的,即还剩下$a_{i}^{"}-a_{i-1}^{"}$的血量,但这个值严格大于$1$,因此第二种攻击被中断,从而无法一次性消灭所有的怪物。
因此$a"$中任意两个元素之间的差值不能超过$1$,可以等于$1$也可以等于$0$。这就启示我们可以遍历$a$数组($a$数组已升序排序),对于$a$中的第$i$个元素,考虑$a"$中的第$i-1$个元素,如果$a_{i} - a_{i-1}^{"} > 1$(假设$a_{0}^{"} = 0$),那么就要对$a_{i}$至少进行$a_{i} - (a_{i-1}^{"} + 1)$次第一种攻击,根据贪心思想我们就取$a_{i} - (a_{i-1}^{"} + 1)$,并且有$a_{i}^{"} = a_{i-1} + 1$。
C. Monsters (easy version)的AC代码如下:
1 #include2 using namespace std; 3 4 typedef long long LL; 5 6 const int N = 2e5 + 10; 7 8 int a[N]; 9 10 void solve() {11 int n;12 scanf("%d", &n);13 for (int i = 1; i <= n; i++) {14 scanf("%d", a + i);15 }16 sort(a + 1, a + n + 1);17 LL ret = 0;18 for (int i = 1; i <= n; i++) {19 if (a[i] != a[i - 1]) {20 ret += a[i] - a[i - 1] - 1;21 a[i] = a[i - 1] + 1;22 }23 }24 printf("%lld\n", ret);25 }26 27 int main() {28 int t;29 scanf("%d", &t);30 while (t--) {31 solve();32 }33 34 return 0;35 }
接下来是hard版本的,其实还是有用到easy版的思想的。hard版本就是求数组的每一个前缀使用第一种攻击的最少次数是多少(easy版就是求整个数组使用的第一种攻击最少是多少)。
在easy版本中$a"$数组可能会存在重复元素,比如有$a = [1,1,3,3,3,5]$,根据上面的算法得到的$a" = [1,1,2,3,3,4]$,就会有重复的数字$1$和$3$,那么最小代价就是$(1-1)+(1-1)+(3-2)+(3-3)+(3-3)+(5-4) = (1+1+3+3+3+5)-(1+1+2+3+3+4) = 2$。即最小代价为$\sum\limits_{i=1}^{n}{a_i} - \sum\limits_{i=1}^{n}{a_{i}^{"}}$。
而如果$a"$中没有重复的元素出现,那么$a"$必然是$1 \sim n$的形式(即$a_{i}^{"} = i$),那么最小代价就是$\sum\limits_{i=1}^{n}{a_i} - \frac{n(n+1)}{2}$。因此如果知道从$a$得到$a"$没有重复元素,那么代价就可以通过公式直接求出来而无需遍历$a$来求$a"$。
之所以要说这个是因为$a"$中从第$2$个开始的重复元素是不会产生代价的,这意味着对应的$a_i = a_{i}^{"}$。这是因为$a"$中相邻两个重复元素的差值为$0$,而根据构造$a"$的贪心原则(只要$a_{i} - a_{i-1}^{"} > 1$,那么$a_{i}^{"} = a_{i-1}^{"} + 1$),两个相邻元素的差值最大为$1$,而只有相邻元素相同即$a_{i} =a_{i-1}^{"}$,才会有$a_{i}{"} = a_{i-1}^{"} = a_{i}$。因此在$a$中,把$a"$中重复的元素所对应的数删除,并不会影响最小代价的结果。
例如$a = [1,1,3,3,3,5]$,$a" = [1,1,2,3,3,4]$,$a_{2}^{"} = 1$和$a_{5}^{"} = 3$都是重复元素,那么在$a$中把对应的下标删除得到$a = [1,3,3,5]$,有$a" = [1,2,3,4]$,代价为$(1+3+3+5)-(1+2+3+4) = 2$。
因此为了求每个前缀的最小代价,每次加入一个新的元素,我们需要维护一个没有重复元素的$a"$以及对应的$a$,这就是解决这题的主要思想。可是关键的地方并不是求$a"$,而是判断每次加入的元素是否会使得$a"$出现重复的元素,以及需要在$a$中删除哪个元素来保证$a"$没有重复的元素出现。前面之所以会讲得这么啰嗦是为了方便读者看得懂下面要说明的解决这个问题的方法,因为我第一次看别人的题解看不懂所以希望记录的详细些。
已知$a = [1,3,3,5]$和$a = [1,1,3,3,3,5]$的代价是一样的,那么$a = [1,3,3,3,3,3,5]$呢?,实际上还是一样的,画个值域图:
其实可以发现,只要$a$中数值为$3$的个数超过$2$个,不管加入再多的$3$(即红色部分)都不会改变代价,也就是说这些多出的$3$是应该被删除的。因为$a"$中相邻的两个数相差最多为$1$,因此在值域不超过$3$的所有数里(即绿色框内的数),只要数的个数超过$3$那么必然至少存在相邻两个数的差值为$0$,即存在值相同的数。更一般的,如果数值小于等于$x$的数的个数超过$x$个,那么总是可以删除多余的数并使得代价不变。
再举例子,红色的数表示可以删除的数(任何不超过$x$的数都不多于$x$个):
假设数值为$i$的数有$c_i$个,对$c$求前缀和那么就得到$s_i = \sum\limits_{j=1}^{i}{c_j}$,表示所有数值不超过$i$的数的个数。因此我们要保证在$a$的每个前缀中,对于所有的$i$(这里的$i$是数值不是下标)都有$s_i \leq i$,即保证任何不超过$i$的数都不多于$i$个,这样才能保证$a"$中不会有重复的数出现,才能用公式$\sum\limits_{i=1}^{m}{a_i} - \frac{m(m+1)}{2}$直接求出前缀的最小代价。
为此,每次加入一个数$x$,我们都要对$s_x \sim s_n$加上$1$(题目中值域的最大值为$n$),然后检查是否存在某个值$s_y > y$(因为每次只增加一个数,因此如果不满足$s_y \leq y$,那么必然就是$s_y = y + 1$),如果存在则找到满足这个情况的最小的值$y"$,然后删除$y"$,最后代入公式求答案即可。
解释一下为什么要找到最小的$y"$,因为删除$y"$后,在后面比$y"$大的数中如果存在$s_{x} > x$的都会变成$s_{x} \leq x$(因为减少了$1$),参考下图:
因此对于$a$的每个前缀,都需要给一个值域区间加上$1$,同时还需要判断值域$1 \sim n$是否都满足$s_i \leq i$的情况。然后$s_i \leq i$其实可以等价成为$s_i - i \leq 0$,因此我们可以用线段树来维护每一个$s_i - i$。值域区间加上$1$就相当于给这个区间的$s_i - i$都加上$1$,然后判断是否存在$s_i - i > 0$并找到满足这个条件最小的值就相当于判断区间的最大值是否大于$0$,并通过二分找到最左边满足大于$0$的那个数。这些都可以用线段树来实现,线段树只需要维护区间的最大值即可。
AC代码如下:
1 #include2 using namespace std; 3 4 typedef long long LL; 5 6 const int N = 2e5 + 10; 7 8 int a[N]; 9 struct Node {10 int l, r, maxv, add;11 }tr[N * 4];12 13 void build(int u, int l, int r) {14 if (l == r) {15 tr[u] = {l, r, -l, 0};16 }17 else {18 int mid = l + r >> 1;19 build(u << 1, l, mid);20 build(u << 1 | 1, mid + 1, r);21 tr[u] = {l, r, max(tr[u << 1].maxv, tr[u << 1 | 1].maxv), 0};22 }23 }24 25 void pushdown(int u) {26 if (tr[u].add) {27 tr[u << 1].add += tr[u].add;28 tr[u << 1].maxv += tr[u].add;29 tr[u << 1 | 1].add += tr[u].add;30 tr[u << 1 | 1].maxv += tr[u].add;31 tr[u].add = 0;32 }33 }34 35 void modify(int u, int l, int r, int c) {36 if (tr[u].l >= l && tr[u].r <= r) {37 tr[u].maxv += c;38 tr[u].add += c;39 }40 else {41 pushdown(u);42 int mid = tr[u].l + tr[u].r >> 1;43 if (l <= mid) modify(u << 1, l, r, c);44 if (r >= mid + 1) modify(u << 1 | 1, l, r, c);45 tr[u].maxv = max(tr[u << 1].maxv, tr[u << 1 | 1].maxv);46 }47 }48 49 int query(int u) {50 if (tr[u].l == tr[u].r) return tr[u].l;51 pushdown(u);52 if (tr[u << 1].maxv > 0) return query(u << 1); // 左边存在大于0的值,那么取左边找53 return query(u << 1 | 1); // 大于0的值在右边54 }55 56 void solve() {57 int n;58 scanf("%d", &n);59 for (int i = 1; i <= n; i++) {60 scanf("%d", a + i);61 }62 build(1, 1, n);63 int cnt = 0; // 当前维护的数的个数64 LL s = 0; // 当前维护的数的总和65 for (int i = 1; i <= n; i++) {66 cnt++, s += a[i]; // 先记录67 modify(1, a[i], n, 1); // a[i]的个数加1,si ~ sn都加1,si-i ~ sn-n都加168 if (tr[1].maxv > 0) { // 存在si-i大于0的数,需要删除最小的那个数69 int x = query(1); // 找到最小的那个数70 modify(1, x, n, -1); // 删除这个数,区间减171 cnt--, s -= x; // 删除最小的那个数72 }73 printf("%lld ", s - cnt * (cnt + 1ll) / 2); // 公式计算答案74 }75 printf("\n");76 }77 78 int main() {79 int t;80 scanf("%d", &t);81 while (t--) {82 solve();83 }84 85 return 0;86 }
参考资料
Codeforces Round #850 (Div. 2) E(二分线段树):https://zhuanlan.zhihu.com/p/603794263
By MilimNava, contest: Codeforces Round #850 (Div. 1, based on VK Cup 2022 - Final Round), problem: (C) Monsters (hard version):https://codeforces.com/contest/1785/submission/192299527
-
快消息!E. Monsters (hard version)
E Monsters(hardversion)Thisisthehardversionoftheproblem Inthisversion,youneedtofin
来源: -
Blazor封装一个显示Markdown的组件
前言最近在用MASABlazor组件库,里面有Markdown编辑器,但如何显示Markdown是个问题。MASABlazor的Markd...
来源: 快消息!E. Monsters (hard version)
日本国产大飞机研发失败:研发耗时十余年
当前视讯!大批《LOL》玩家逃离国服挤爆台服 拳头调查处理中
Blazor封装一个显示Markdown的组件
高层次综合器Vivado HLS的概念与特点[原创www.cnblogs.com/helesheng]
头条:为何突然爆红网络?小胖俞涛回应“九转大肠梗” 吃起来确实酸爽
【环球报资讯】天马认领:独家供应一加Ace 2 1.5K灵犀触控屏
世界报道:HashMap源码分析 (基于JDK1.8)
cmd的一些命令
焦点速看:Python教程:高级特性
天天快看点丨vue3 | slots
通讯!0糖0脂0卡 三种口味 哪吒气泡水1.66元/瓶史底
世界今亮点!逆天!男子称在国美买家电两年没到货 花费超两万
全球热消息:影驰首次涉足游戏显示器:27寸2K屏、165Hz高刷
奔驰史诗级调整:19款车将停产!不挣钱的不要
世界热门:宁德时代两大杀手级新品电池正式来了:新能源汽车市场要变天?
VGA、TFT显示模块——verilog实现
天天看热讯:智能运维|AIRIOT智慧光伏管理解决方案
定时任务
14.9mm纤薄机身惊艳:联想小新Air 14 2023烟霞紫亮相
观热点:1099元起 真我推出V30/V30t新机:天玑700入门U
环球热点评!3月1日上线全国外卖服务?抖音回应:无具体时间表
《GTA5》母公司T2 CEO:ChatGPT等AI将提高游戏行业的标准
记录--实时音视频功能简析(live-pusher与live-player)
当前资讯!全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全球看点:Amazon RDS 教程_编程入门自学教程_菜鸟教程-免费教程分享
整合MQTT
当前简讯:京东一面:MySQL 中的 distinct 和 group by 哪个效率更高?问倒一大遍。。
业界功率最高!一加27W冰点散热背夹发布 219元
蔚来:自家充电桩仅24%时间给蔚来充电 比亚迪、特斯拉用爽了
世界微资讯!ChatGPT幕后创始人拿微软100亿 是在下一步大棋
【热闻】你出国耍吗?多条国际航班机票降至千元 泰国往返国内不到2000元
焦点观察:日产扛把子!新款轩逸/轩逸e-POWER官图发布:能救市吗?
3.SpringSecurity+登录功能+jwt校验过滤器+redis配置
当前消息!K8S的基础概念
今亮点!elementui中el-table表头动态筛选条件未及时更新问题解决
世界新消息丨C#高级编程2
RocketMQ Streams拓扑构建与数据处理过程
全球动态:一加Ace 2全球首发1.5K灵犀触控屏:120Hz刷新率、1450nit高亮度
每日消息!知名玩家爆料魔兽国服已签新代理:暴雪相中上海一公司
全球热点!土耳其再发生5.2级地震:中国卫星传回土耳其地震震中图像
全麦+黑麦:舌里0脂肪全麦面包14.9元2斤40片大促
国产版ChatGPT!百度版已成功注册ERNIE商标:最快3月开放
强大的word插件:不坑盒子下载安装使用图文讲解
ChatGPT横空出世,虽然会改BUG,但程序员也不用慌
天天简讯:强大的word插件,让工作更高效:不坑盒子 2023版
pandas 用户数据分析2
车顶维权女车主:重启战斗模式 希望今年能明确特斯拉案件结果
小米首款二合一笔记本!小米笔记本12.4图赏
每日速看!陪伴十年被撞报废!男子躲过一劫磕头跪别爱车 网友:它值得
环球视点!一加Ace 2普及16GB超大内存:44个应用保活
世界观点:首批入手三星Galaxy S23用户开机后大跌眼镜:系统吃掉60GB存储空间
【天天速看料】【算法训练营day41】LeetCode343. 整数拆分 LeetCode96. 不同的二叉搜索树
今日观点!亚马逊商城入门教程_编程入门自学教程_菜鸟教程-免费教程分享
天天快资讯:计算机视觉——SSD和YOLO简介
焦点热议:CTF之WEB学习路线规划
当前焦点!第一个编译器
上海网红“安福路小公主”接代言引热议:网友感叹辣眼睛的大妈无敌了
全球播报:13代CPU+40系GPU 笔记本和台式机区别有多大?
微头条丨100%纯棉 班尼路短袖99元4件包邮:13色可选
今日热文:ChatGPT概念全球爆火!我国人工智能相关企业超百万家
没法出二手“回血”了!索尼称PS VR2初期将仅推出数字版游戏
视讯!火山引擎ByteHouse助力中国地震台网中心,快速构建一站式实时数仓
实战分享 | 金融数据采集报送平台实践
观天下!我是如何用CAP和BASE两个基础理论卷死其他组员的?
环球信息:【踩坑记录】@Transactional注解回滚不生效问题
世界微资讯!开心档-软件开发入门之MongoDB 覆盖索引查询
世界动态:89%美国大学生用写作业!揭秘爆红ChatGPT之父:应对核末日狂囤黄金、中学就出柜
当前快报:2023年首次更新!微信Mac版3.7.0发布:终于支持图片文字提取
世界观察:Github、Gitee优秀的开源项目
【ChatGPT 注册】
【天天聚看点】ChatGPT让苹果急了!消息称苹果将于下周召开内部AI峰会
环球快资讯丨299元!小米对讲机2S发布:市区5公里通话 100个对讲频道
热议:4个小号给大号浇水 缴电费再退骗蚂蚁森林能量被封号!法院判了
人工智能立大功!AI筛查阿尔茨海默病准确率达75%
每日视点!19999元!尼康发布尼克尔Z 85mm f/1.2 S镜头:模特发丝根根可数
观天下!从这些爆款小游戏中,你看到了什么?
Docker容器使用 (入门到精通)
HGAME_2023_WEB_WP_WEEK3
2799限量抢!小米Civi 2潮流版预售 网友:我一男生都表示太好看
世界报道:豆瓣仅5.7分 漫威超英大片《黑豹2》国内首映 开场票房就被《流浪地球2》超越
每日速递:男子花两千元套圈 套中两台宏光汽车:本人回应只要一辆 做人留一线
国产纯电两门跑车!哪吒E实车亮相:动力暴躁
焦点!百度类ChatGPT产品“文心一言”公开:股价应声上涨13%
诺基亚800c手机上市价格是多少?诺基亚800c手机参数
breeno指令是干什么用的?breeno指令在哪里?
戴尔笔记本电脑换电池大概多少钱?戴尔笔记本电脑开机黑屏没反应怎么办?
格力空调型号在哪里查看?格力空调型号一览表匹数
美的冰箱质量怎么样?美的冰箱怎么调温度?
天天视讯!Redis的十六种应用场景
全球短讯!一款备受欢迎的用户脚本管理器插件TampermonKey-油猴脚本管理器安装与使用
越狱最后各人物的结局是什么?电视剧越狱演员表
曾志伟的身高是什么?曾志伟个人资料
12月是什么星座?描写12月你好的优美说说
取关是什么意思?取关抖音好友对方知道吗?
期中考试家长意见怎么写?期中考试后的感想作文模板
热点评!19岁中国小伙确诊老年痴呆 全球纪录又被刷新了
全球看点:土耳其大地震 多家中国上市公司称影响有限
ChatGPT教你写AI包教包会!7段对话写出识别程序 准确度最高达99.7%
每日资讯:小米Civi 2潮流限定版来了:后盖上全是粉色Hello Kitty 超萌