<题解>「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 ...
随机推荐
- linux 之awk--格式化文本信息
https://www.cnblogs.com/xudong-bupt/p/3721210.html awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常 ...
- tomcat与springmvc 结合 之---第18篇 StandContext容器和SpringMVC的监听器的模型
writedby张艳涛 如何使用tomcat的监听器 public class BootStrap_ex06 { public static void main(String[] args) { Ht ...
- videojs踩过的坑
1.videojs-contrib-hls 在webpack中不能用,解决方法:window.videojs = videojs:出处 https://github.com/videojs/video ...
- MyBatis使用Zookeeper保存数据库的配置,可动态刷新
核心关键点: 封装一个DataSource, 重写 getConnection 就可以实现 我们一步一步来看. 环境: Spring Cloud + MyBatis MyBatis常规方式下配置数据源 ...
- noip模拟32[好数学啊]
noip模拟32 solutions 真是无语子,又没上100,无奈死了 虽然我每次都觉得题很难,但是还是有好多上100的 战神都200多了,好生气啊啊啊 从题开始变难之后,我的时间分配越来越不均匀, ...
- 20初识前端HTML(1)
1 .HTML 1.1 网页的组成 文字 图片 链接 等元素构成.除了这些元素之外 网页中还可以包含音频 视频 等 1.2 WEB前端开发的流程 现在主流的开发流程: 前后端分离的开发模式. 美工:p ...
- tomcat启动时启动窗口出现乱码一招搞定
先来看看问题(图示),在tomcat的启动窗口打印的启动信息中包含了大量的中文乱码,虽然这些对tomcat本身的使用没有任何影响,但却非常碍眼,影响视觉效果! tomcat启动时启动窗口出现乱码的解决 ...
- LaTex公式语法教程及手册(附emlogpro公式显示插件katex说明)
目录 第一列 第二列 第三列 效果 求和(使用\sum标签) 文本效果 本插件简介 积分(使用\int标签) 文本大小 LaTex是什么 空格 特殊符号 LaTex公式使用教程及手册 定界符 LaTe ...
- 解决ftp登录问题:500 OOPS: cannot change directory:/home/xxx 500 OOPS: child died
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- Python语言系列-10-数据库
MySQL 基础环境准备 readme.txt 作者:Alnk(李成果) 版本:v1.0 安装mysql数据库 略 创建student库 # mysql> create database stu ...