序列(seq)
序列(seq)
题目描述
给定 N,A,BN,A,B,构造一个长度为 NN 的排列,使得:
排列长度为 N;
最长上升子序列长度为 A;
最长下降子序列长度为 B。
我们有 SPJ,有解任意给出一组,否则说明无解。
输入
第一行一个整数 TT (1≤T≤101≤T≤10), 表示数据组数.
接下来 T 行,每行三个正整数 N、A、B。
输出
对每组数据:
如果有解,输出两行,第一行一个字符串 Yes,接下来一行 N 个整数,表示排列。
否则, 输出一行一个字符串 No。
样例输入
3
4 2 2
4 4 1
4 3 3
样例输出
Yes
3 4 1 2
Yes
1 2 3 4
No
提示
数据范围和子任务
对于全部的测试数据,保证 T≤10,N≤105,∑N≤2×105T≤10,N≤105,∑N≤2×105
子任务 1(20 分):N≤5N≤5 .
子任务 2(30 分):每组数据均满足 N=A×BN=A×B .
子任务 3(20 分):B≤2B≤2 .
子任务 4(30 分):无特殊限制
solution
先考虑a*b=n的情况怎么做:连续构造a段下降的b
比如 n=6 a=3 b=2
-> 2 1 4 3 6 5
那么如果a>n/b 呢
就把某些段改成升序的
由于每一段之间互不影响,所以这不会改变b的答案
那么n!=a*b 也只是多了一段小段的而已
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100005
using namespace std;
int T,n,a,b,ans[maxn],num[maxn];
void init(){
for(int i=1;i<=n;i++)ans[i]=num[i]=0;
}
int main()
{
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
cin>>T;
while(T--){
scanf("%d%d%d",&n,&a,&b);init();
if(a+b>n+1){puts("No");continue;}
for(int i=1;i<=n;i+=b){
int top=i+b-1;top=min(top,n);num[i]=top-i+1;
for(int j=top,x=0;j>=i;j--,x++)ans[j]=i+x;
}
int tmp=n/b;if(n%b)tmp++;
if(tmp>a){puts("No");continue;}
int tp=a-tmp,i=b+1;
while(tp){
if(tp>=num[i]-1){
for(int j=i;j<=i+num[i]-1;j++)ans[j]=j;
tp-=num[i]-1;i=i+b;
}
else {
for(int j=i;j<=i+tp-1;j++)ans[j]=j;
for(int j=i+num[i]-1,x=tp;j>=i+tp;j--,x++)ans[j]=i+x;
tp=0;
}
}
puts("Yes");
for(int i=1;i<=n;i++)cout<<ans[i]<<' ';cout<<endl;
}
return 0;
}
序列(seq)的更多相关文章
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- 【双标记线段树】bzoj1798维护序列seq
一.题目 描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列 ...
- bzoj 维护序列seq(双标记线段树)
Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 4184 Solved: 1518[Submit][Status][Discus ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- BZOJ1798 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 8058 Solved: 2964[Submit ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
随机推荐
- EM理解(转)
EM是我一直想深入学习的算法之一,第一次听说是在NLP课中的HMM那一节,为了解决HMM的参数估计问题,使用了EM算法.在之后的MT中的词对齐中也用到了.在Mitchell的书中也提到EM可以用于贝叶 ...
- Redis学习记录(一)
在学习Redis之前,要知道什么是NoSQL? 1.NoSQL 1.1. 什么是NoSQL NoSQL(NoSQL = Not Only SQL),表示“不仅仅是SQL”,泛指非关系型数据库. 1.2 ...
- C#装箱与拆箱的研究
在对这个问题展开讨论之前,我们不妨先来问这么几个问题,以系统的了解我们今天要探究的主题. 观者也许曾无数次的使用过诸如System.Console类或.NET类库中那些品种繁多的类.那么,我想问的是它 ...
- PAT 乙级 1044
题目 题目地址:PAT 乙级 1044 思路 简单的进制转化问题,根据题意进行相应的进制转化即可,因为题目已经划定了数据的求解范围,甚至连进制转化中的循环都不需要,进行简单计算就可以得出结果: 但本题 ...
- 2- vue django restful framework 打造生鲜超市 -环境搭建
使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(暂不支持微信支付),支持手机短信验证码注册, ...
- 四、Shell 数组
Shell 数组 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. She ...
- Python之路-基础数据类型之字符串
字符串类型 字符串是不可变的数据类型 索引(下标) 我们在日常生活中会遇到很多类似的情况,例如吃饭排队叫号,在学校时会有学号,工作时会有工号,这些就是一种能保证唯一准确的手段,在计算机中也是一样,它就 ...
- input type=file输入框
<div class="row"> <!--选择图片按钮--> <div class="col-xs-12" align=&quo ...
- shell脚本入门基础知识
shell 脚本的第一行 #!/bin/bash #!/bin/sh 其实,sh是bash的一个软链接 sh -> bash 变量,字母下划线开头(好像是没有类型的) #普通变量 var1=ni ...
- 配置Spring.NET
先引入关键的程序集 Common.Logging.dll Spring.Core.dll 在配置文件配置中: <configSections> ...... <sectionGrou ...