<题解>「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 ...
随机推荐
- (python函数01)enumerate函数
enumerate函数 enumerate函数示例代码01运行结果01示例代码02运行结果02 enumerate(枚举,列举)是python的内置函数,enumerate的参数为可迭代对象,如字符串 ...
- No_1 手写Proxy
手写动态代理主要原理: userDAO=(UserDAO)Proxy.newProxyinstance(classloader,interfaces[],new MyInvocationHandler ...
- Echarts +ajax+JSONPObject 实现后台数据图表化
显示效果 实现步骤: 1-引入e-char,jquery资源, 2-发起jsonp跨域请求, 3-服务器端返回return new JSONPObject(callback, value);数据 4- ...
- vscode源代码管理(vscode报错 未找到Git,请安装Git,或在"git.path" 设置中配置)
vscode源代码管理(vscode报错 未找到Git,请安装Git,或在"git.path" 设置中配置) 直接上图,电脑上已经安装git,由于vscode没有找到git,所以v ...
- Python实用案例,Python脚本,Python实现文件自动归类
前言: 今天我们就利用Python脚本实现文件自动归类吧.直接开整~ 预备知识 这个脚本实现比较简单,我把涉及的知识点列了出来. 1.相对路径.绝对路径,绝对路径就是最完整的路径. 'D:/code/ ...
- HttpRunner3源码阅读: 1. 目录结构分析
初衷 身处软件测试行业的各位应该都有耳闻HttpRunner 开源测试工具/框架(接口测试),作者博客 为什么出这系列? 不少测试同行都建议阅读HttpRunner,源码学习其设计思想. 社区当下Py ...
- ZooKeeper(2181、2171) 未授权访问
下载地址http://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/ tar -xzvf zookeeper-3.4.14.tar.gz cd ...
- 🔥 LeetCode 热题 HOT 100(71-80)
253. 会议室 II(NO) 279. 完全平方数 class Solution { public int numSquares(int n) { // dp[i] : 组成和为 i 的最少完全平方 ...
- 🔥 LeetCode 热题 HOT 100(1-10)
1. 两数之和 思路一:暴力遍历所有组合 class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; ...
- Redis 实战篇:巧用数据类型实现亿级数据统计
在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合,同时还要对集合中的数据进行统计排序. 常见的场景如下: 给一个 userId ,判断用户登陆状态: 两亿用户最近 7 ...