[题解]CF1774C Ice and Fire
题意简述
有\(n\)个人,第\(i\)个人温度为\(i\),进行\(n-1\)次对战。
所以给出一个长度为\(n-1\)的\(01\)串\(s\),\(s_i\)表示第\(i\)局的对战环境为\(0\)或\(1\)。
每局任意选出\(2\)人对战,规则如下:
- 如果该局对战环境为\(0\),则两人中温度低的获胜。
- 如果该局对战环境为\(1\),则两人中温度高的获胜。
- 每局结束,失败者被淘汰,其他玩家继续对战。
给定\(T\)组测试样例,每组样例给出\(n\)和长度为\(n\)的\(s\)。
对于每组样例,请分别输出前\(2\)个人、前\(3\)个人、……、前\(n\)个人按\(s\)的规则进行对局(\(s\)可能有剩余),多少人有机会获胜。
思路分析
咱先管前\(n\)个对局的情况。
首先可以发现当\(s\)全为\(0\)时,答案就是\(1\),而\(s\)全为\(1\)时,答案就是\(n\)。
那么当\(s\)是\(000111\)这种有两段的,怎么办?
\(s\)为两段的分析
\(n=6,s=00011\)时,我们发现填完前面\(3\)个\(0\)时,答案就是剩下的最大值了。所以我们只需要考虑前三轮对局剩下玩家的最大温度是多少。
我们设最后一段的长度为\(k=2\)。
我们可以发现如果某次对局环境是\(0\),那么我们能淘汰掉的值在\([2,n]\)区间内;如果是\(1\)则在\([1,n-1]\)内。
于是在这个样例中,前\(3\)次对战就相当于在\([2,6]\)中选取\(n-k-1=3\)个值淘汰掉,剩下\(3\)个。
- 如果淘汰掉的人正好是\(\{6,5,4\}\),那么最大值就是\(3\)了。
- 如果淘汰掉的人是\(\{6,5,3\}\)、\(\{6,5,2\}\)等,那么最大值就是\(4\)了。
- 如果淘汰掉的人是\(\{6,4,3\}\)等,那么最大值就是\(5\)了。
- 如果淘汰掉的人是\(\{5,4,3\}\)等,那最大值不变,就是\(6\)。
综上我们可以发现,\(s\)为两段时,根据被淘汰的人的连续情况,剩下人的最大值在\([k+1,n]\)之间,故答案为\(n-k\)。
推广——\(s\)为多段的分析
当\(s\)为\(3\)段或以上,会怎样呢?
\(n=7,s=100011\)时,\(k=2\),同样是求对战\(4\)次后的最大值。
那么前\(4\)次对战,我们相当于在\([1,n-1]\)淘汰掉\(1\)个,再在\([2,n]\)淘汰掉\(3\)个。
于是前\(4\)次对战就相当于在\([1,n]\)中选取\(n-k-1=4\)个值淘汰掉,剩下\(3\)个。
是不是很眼熟?只不过这次的区间是\([1,n]\),但是显然这并没有影响。因为对战一共\(n-1\)局,所以在最后一段前最多进行\(n-2\)次比赛。最坏情况我们可选淘汰的区间长度为\(n-1\),这种情况刚好够组成\(n-k\)个最大值,更别说这种可选区间长度为\(n\)的情况了。
所以呢,答案还是\(n-k\)。
预处理
至此,求前\(x\)个的答案,就是看\(s\)的前\([1,x]\)中,最后一段的长度。
直接遍历求每一个会超时,所以我们可以用\(dp\)的思想预处理一下。
实现见代码吧。
Code
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int t,n,siz[200010];
string s;
int main(){
cin>>t;
while(t--){
cin>>n>>s;
int len=s.size();
siz[0]=1;
for(int i=1;i<len;i++){
if(s[i]==s[i-1]) siz[i]=siz[i-1]+1;
else siz[i]=1;
}
for(int i=2;i<=n;i++){
cout<<i-siz[i-2]<<" ";
}
cout<<endl;
}
return 0;
}
[题解]CF1774C Ice and Fire的更多相关文章
- 【腾讯Bugly干货分享】移动App入侵与逆向破解技术-iOS篇
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e0acc896e9ebb6865f321 如果您有耐心看完这篇文章,您将懂 ...
- JavaScript构造函数+原型创建对象,原型链+借用构造函数模式继承父类练习
虽然经常说是做前端开发的,但常常使用的技术反而是JQuery比较多一点.在JavaScript的使用上相对而言少些.尤其是在创建对象使用原型链继承上面,在项目开发中很少用到.所以今天做个demo练习一 ...
- python 自然语言处理(四)____词典资源
词典或者词典资源是一个词和/或短语及其相关信息的集合,例如:词性和词意定义等相关信息.词典资源附属于文本,而且通常在文本的基础上创建和丰富.下面列举几种nltk中的词典资源. 1. 词汇列表语料库 n ...
- 9.Solr4.10.3数据导入(post.jar方式和curl方式)
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.使用post.jar方式 java -Durl=http://192.168.137.168:8080/s ...
- Solr记录-solr检索和查询数据
Solr检索数据 在本章中,我们将讨论如何使用Java Client API检索数据.假设有一个名为sample.csv的.csv文档,其中包含以下内容. 001,9848022337,Hyderab ...
- Kafka Streams开发入门(2)
背景 上一篇我们介绍了Kafka Streams中的消息转换操作map,今天我们给出另一个经典的转换操作filter的用法.依然是结合一个具体的实例展开介绍. 演示功能说明 本篇演示filter用法, ...
- Django总结篇
1.0 简述http协议和常用请求头 http协议: ( 基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)) HTTP协议是Hyper Text Transfer Pro ...
- Deep Dive into Neo4j 3.5 Full Text Search
In this blog we will go over the Full Text Search capabilities available in the latest major release ...
- AHUACM寒假集训II(线段树)
B.Mayor's posters POJ2528 题目大意: D.Count Color POJ2777 题目大意:长为 L ( L ≤ 1 0 5 ) L( L\leq10^5) L(L≤105) ...
- HDU 1045(Fire Net)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...
随机推荐
- 【深度评测】Joomla Auto Readmore插件:自动提取缩略图+智能摘要,双引擎驱动内容效率革命
"文章缩略图与摘要分离管理.重复上传图片.移动端封面图比例失调--"这些Joomla站长的经典痛点,如今被Auto Readmore插件的全自动缩略图提取功能彻底终结.本文将深度解 ...
- Linux c 运行时获取动态库所在路径
记录一下如何在Linux环境下运行时获取动态库路径. 只讨论Linux amd64和arm64环境,因为使用的办法都是平台相关的不具备可移植性. 准备 一般来说动态库并不需要关心自己所在的文件系统上的 ...
- 文本分割器html代码
旨在优化文本处理任务的效率与效果.其核心功能是通过分析文本结构.语义或固定长度,将大段内容拆分为逻辑连贯的小单元,从而适配下游任务的输入限制(如大语言模型的上下文窗口),或提升文本分析的精准度.支持按 ...
- PTA 4-1
PTA 习题4-1 求奇数和 (15分) 本题要求计算给定的一系列正整数中奇数的和. 输入格式: 输入在一行中给出一系列正整数,其间以空格分隔.当读到零或负整数时,表示输入结束,该数字不要处理. ...
- 视频音频对嘴--Wav2Lip
之前介绍了将图片加音频进行对嘴处理,生成新的视频:基础版: https://www.cnblogs.com/cj8988/p/18952604 进阶版(加表情) :https://www.cnblog ...
- 一个C#二维码图片识别
https://www.cnblogs.com/xuezhizhang/p/8968515.html 关键是这个 ThoughtWorks.QRCode.Codec; NuGet直接下载就可以了 // ...
- AI领域又新增协议: AG-UI
随着AI的快速发展正在重塑技术生态,协议的演进速度尤为迅猛.一个令人头疼的问题浮现了:不同的AI智能体和前端应用之间就像说着不同语言的人,无法顺畅交流.开发者们需要为每个智能体单独编写接口,维护成本高 ...
- 安装程序无法自动安装virtual machine
安装VMware Tools 失败 发现在给过旧的系统安装 安装VMware Tools 的时候,会失败,比如 win7.win server2008等. 原因 官网的说明,在这里 看不懂的自行翻译: ...
- Andriod SDK安装教程
前言 最简单的方式 我们使用ANDROID STUDIO这款开发工具下载对应的Andriod SDK. 可是我们如果不开发安卓,只是用它的一些SDK包的话而安装整个开发工具,就没必要了. 这里讲的是用 ...
- Luogu P9588 队列 题解
P9588 队列 考虑转化问题,将原问题转化为一个长度为 \(q\) 的序列.序列中 \(x\) 表示一段 \(1\sim x\) 的区间. 操作 \(1\) 每次增加时,输入 \(x\),在数组末尾 ...