<题解>「LibreOJ NOIP Round #1」序列划分
solutions
题面loj#542
对我来说,这或许已经超出了我的能力,我,只能看题解
不知道我写完这一篇题解之后,会不会对我的构造题有一点点的帮助
让我在这类题的解决上能过有一些提升
直接说明白,这就是一个构造题
这个很好判断,因为有SPJ,并且方案有很多,随便输出就可以
开头是K,结尾是K,长度也是K
总结一下,我们一定可以将这个序列划分成K个序列,如果你划分的更多的话,我完全可以将多出来的合并一下
并且,我们的起点和终点,一定是前K个和后K个可以被K整除的数,
如果不是,那肯定前面或者后面有剩余的,直接换一下起点终点就行了
那么我们就可以着手去做这道题了,
我们会有两种情况,其余更多的情况都可以直接转化成这两种当中的一种
我们将左端点和右端点,按照位置大小从小到大,分别存入两个数组中
第一种,每一个左端点都对应相应的右端点,就是说左端点和右端点在各自数组中的排名是相同的(具体看代码ckfi)
如果你当前左端点对应的是后面的右端点,那么后面一定有一个左端点对应当前应该对应的右端点,我就可以开始转化了
第二种,第一种中有些序列不能覆盖完全当前左端点到下一个左端点的区间内的点,
那么就让第一个左端点和最后一个右端点空出来,每一个左端点都匹配它前一个右端点
最后用第一个左端点和最后一个右端点把没有加上的点全部都加上去就好了
于是我们只需要对两种情况分别判断就好了
这两种情况中只能满足一个,这个很显然吧,因为如果第二个满足的话,第一个肯定不够啊
code
#include<bits/stdc++.h>
using namespace std;
#define re register int
const int N=1e6+5;
int n,k,a[N];
void F(){printf("No\n");}
int l[N],lc,r[N],rc,p[N];
void pri(int &it,int tot){while(tot&&it<=n)if(a[it++])a[it-1]=0,printf("%d ",it-1),tot--;}
bool chfi(){
int it=0,las,nf;
for(re i=1;i<k;i++){
it+=k-2;while(it<p[l[i+1]])it+=k;
if(it>p[r[i]])return false;
}
printf("Yes\n%d\n",k);
it=0;las=0;nf=2;
for(re i=1;i<k;i++){
las=it;it+=k-2;while(it<p[l[i+1]])it+=k;
printf("%d %d ",it-las+2,l[i]);
pri(nf,it-las);printf("%d\n",r[i]);
}
printf("%d %d ",p[n]-it+2,l[k]);
pri(nf,p[n]-it);printf("%d\n",r[k]);
return true;
}
bool chse(){
int it=0,nf;
for(re i=2;i<=k;i++){
it=max(it,p[l[i]]);it+=k-2;
if(it>p[r[i-1]])return false;
}
printf("Yes\n%d\n",k);nf=0;
for(re i=2;i<=k;i++){
while(p[nf]<=p[l[i]])nf++;
printf("%d %d ",k,l[i]);
pri(nf,k-2);printf("%d\n",r[i-1]);
}
printf("%d %d ",p[n]-(k-2)*(k-1)+2,l[1]);
nf=2;pri(nf,p[n]-(k-2)*(k-1));printf("%d\n",r[k]);
return true;
}
signed main(){
int o;scanf("%d",&o);
scanf("%d%d",&n,&k);
for(re i=1;i<=n;i++)scanf("%d",&a[i]),a[i]=(a[i]%k!=0);
if(n%k||n<1ll*k*k||a[1]||a[n]){F();return 0;}
for(re i=1;i<=n;i++)if(!a[i])l[++lc]=i;
for(re i=n;i>=1;i--)if(!a[i])r[++rc]=i;
if(lc<k||rc<k||l[k]>=r[k]){F();return 0;}
lc=rc=k;reverse(r+1,r+k+1);
for(re i=l[k]+1;i<r[1];i++)a[i]=1;
for(re i=1;i<=n;i++)p[i]=p[i-1]+a[i];
if(chfi()||chse());else F();
}
<题解>「LibreOJ NOIP Round #1」序列划分的更多相关文章
- 题解【loj537】「LibreOJ NOIP Round #1」DNA 序列
题目描述 \(NOIP\)复赛之前\(HSD\)桑进行了一项研究,发现人某条染色体上的一段\(DNA\)序列中连续的\(k\)个碱基组成的碱基序列与做题的 \(AC\) 率有关!于是他想研究一下这种关 ...
- 「LOJ 537」「LibreOJ NOIP Round #1」DNA 序列
description NOIP 复赛之前,HSD 桑进行了一项研究,发现人某条染色体上的一段 DNA 序列中连续的\(k\)个碱基组成的碱基序列与做题的 AC 率有关!于是他想研究一下这种关系. 现 ...
- 【LibreOJ】#538. 「LibreOJ NOIP Round #1」数列递推
[题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列 ...
- 「LOJ 538」「LibreOJ NOIP Round #1」数列递推
description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从\(0\)开始,无限长的整数列\({a_ ...
- LibreOj #539. 「LibreOJ NOIP Round #1」旅游路线
题目链接 做完这道题,我深知当一个问题复杂度过高的时候,把一些可以分离的操作都分散开,可以大幅度降低复杂度..... 发现无论有多少钱,每到一个点后扩展到的距离被限制在 \(min(C, c[i])\ ...
- 「LibreOJ NOIP Round #1」旅游路线
Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...
- LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)
哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...
- LibreOJ #541. 「LibreOJ NOIP Round #1」七曜圣贤(单调队列)
被以前自己瞎YY的东西坑了T T...单调队列的确是可以维护这种操作的.... 显然这题可以转化成维护不在车上的东西的最小值, 支持插入和删去最早出现的值,然后就可以用单调队列了T T #includ ...
- 「LibreOJ NOIP Round #1」七曜圣贤
题目啰嗦:支持三个操作: 不可重复集合:1.加入一个数 2.删除一个数 3.恢复目前最早的一次删除的数 操作可能不合法,每次有效操作之后求集合的mex(最小没有出现过的数) 50组数据+1e6,必须O ...
随机推荐
- TS中 使用deprecated 实现对方法的迭代弃用
在日常开发中,我们会定义大量方法函数来提供给业务调用,可随着时间与业务的推进, 有些方法可能不切合当下需求, 或将被逐步废弃并替换到新的方法中, 例如 框架中 部分生命周期的废弃. 此时作为开发者就很 ...
- MP4命令行处理
MP4Box可用于生成符合MPEG-DASH规范的内容,也就是ISO / IEC 23009-1在ISO公共可用标准中可用的内容. dash切片命令: mp4box -dash 5000 -frag ...
- Wordpress 4.6 任意命令执行漏洞(PwnScriptum)
漏洞存在后台登录地方的找回密码页面:http://192.168.49.2:8080/wp-login.php?action=lostpassword 抓包进行修改包 输入一个存在的用户,然后点击获取 ...
- spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
参考 文章https://blog.csdn.net/weixin_41438728/article/details/110425174 影响版本 Spring Framework 5.0 to 5. ...
- 官宣|VS Code 1.59 发布!Terminal 可以跨窗口移动了!
欢迎使用 2021 年 7 月版的 Visual Studio Code.我们希望您会喜欢此版本中的许多更新与改进,以下是其中的一些高亮: 扩展视图的改进 - 丰富的扩展详细信息悬停,新的运行状态标签 ...
- CentOS 7 安装虚拟机
1.本次安装centos7 安装使用的软件是VitrualBox 虚拟机软件 Oracle公司的虚拟机软件,免费商品(大家可以百度搜索去官网下载) 1:我这里使用的是阿里的centos7的镜像(大家可 ...
- LeetCode入门指南 之 排序
912. 排序数组 给你一个整数数组 nums,请你将该数组升序排列. 归并排序 public class Sort { //归并排序 public static int[] MergeSort(in ...
- WanJetpack项目:用Jetpack实现玩Android,追求最官方的实现方式
项目简介 玩Android demo.用Jetpack MVVM开发架构.单Activity多Fragment项目设计,项目结构清晰,代码简洁优雅,追求最官方的实现方式.用到以下知识点: LiveDa ...
- springboot上传文件路径存放
@Beanpublic EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() { return (Config ...
- A Python Environment Detector
The user provide the method to get result(command on remote host), the check standard(a callback fun ...