<题解>「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 ...
随机推荐
- jstack 命令使用经验总结
jstack 命令的基本使用 jstack 在命令使用上十分简洁, 其信息量与复杂度主要体如今 thread dump 内容的分析上;web # 最基本的使用sudo -u xxx jstack {v ...
- HCNA Routing&Switching之二层交换技术VLAN基础
前文我们主要聊了下交换机的工作原理和以太网接口的速率和双工相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15088183.html:今天我们主要来聊一 ...
- Apache ActiveMQ(cve-2015-5254)
影响版本 Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞 复现 使用工具执行命令 工具地址 https://github.com/matthiaskaiser/jmet/re ...
- Mybatis学习笔记-CRUD
namespace namesapce中的包名需与Dao/Mapper接口的包名一致 SELCET 选择,查询语句 id:对应namespace中的方法: resultType:Sql语句执行的返回值 ...
- 为什么crictl和ctr的输出有时不一样
containerd 相比于docker , 多了namespace概念, 每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间 cr ...
- 月薪60k,仍无人问津,腾讯阿里到底有多缺这类程序员?
不知道大家发现没,近几年,国内对音视频人才需求越来越大了,在某招聘网站上居然薪酬高达60k. 从未来的大趋势来看,随着5G时代的到来,音视频慢慢变成人们日常生活中的必须品.除了在线教育.音视频会议.即 ...
- lerna 常用命令
lerna 介绍 lerna 处理机构 固定模式(fixed) 所有包是统一的版本号,每次升级,所有包版本统一更新,不管这个包内容改变与否 具体体现在,lerna 的配置文件 lerna.json 中 ...
- MapReduce框架原理-InputFormat数据输入
InputFormat简介 InputFormat:管控MR程序文件输入到Mapper阶段,主要做两项操作:怎么去切片?怎么将切片数据转换成键值对数据. InputFormat是一个抽象类,没有实现怎 ...
- Redis缓存哪些事儿
一提到Redis缓存,我们不得不了解的三个问题就是:缓存雪崩.缓存击穿和缓存穿透.这三个问题一旦发生,会导致大量的请求直接请求到数据库层.如果并发压力大,就会导致数据库崩溃.那p0级的故障是没跑了. ...
- 关于Algorithm in Nutshell源代码
获取源码包 "Algorithm in Nutshell"的源码包ADK-1.0.zip在这本书主页上"Download Example Code"页面的Rel ...