bzoj1046 [HAOI2007]上升序列
【bzoj1046】[HAOI2007]上升序列
Description
对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ax2 < … < axm)。那么就称P为S的一个上升序列。如果有多个P满足条件,那么我们想求字典序最小的那个。任务给出S序列,给出若干询问。对于第i个询问,求出长度为Li的上升序列,如有多个,求出字典序最小的那个(即首先x1最小,如果不唯一,再看x2最小……),如果不存在长度为Li的上升序列,则打印Impossible.
Input
第一行一个N,表示序列一共有N个元素第二行N个数,为a1,a2,…,an 第三行一个M,表示询问次数。下面接M行每行一个数L,表示要询问长度为L的上升序列。
Output
对于每个询问,如果对应的序列存在,则输出,否则打印Impossible.
Sample Input
3 4 1 2 3 6
3
6
4
5
Sample Output
1 2 3 6
Impossible
数据范围
N<=10000
M<=1000
题解
首先求出以每个数为开头上升序列长度,即倒着做最长下降子序列
然后,把字典序尽量小的放前面
即若要求的序列长度为x,如果以第一个数(字典序最小的数)开头的最长上升子序列大等于x,则将它放在答案第一个,第二个数开头小于x,则舍弃,第三个大于x-1,放答案第二个,以此类推
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 8 const int NN=100007; 9 10 int n,m,cnt; 11 int a[NN],f[NN],best[NN];//f表示以i开头最长上升序列长度是多少,best是求解用的而已。 12 13 void solve(int x) 14 { 15 int last=0; 16 for(int i=1;i<=n;i++) 17 if(f[i]>=x&&a[i]>last)//满足即可,n复杂度求解最小字典序 18 { 19 printf("%d",a[i]); 20 if(x!=1) printf(" "); 21 last=a[i]; 22 x--; 23 if(!x)break; 24 } 25 printf("\n"); 26 } 27 int find(int x) 28 { 29 int l=1,r=cnt,ans=0; 30 while(l<=r) 31 { 32 int mid=(l+r)>>1; 33 if(best[mid]>x)ans=mid,l=mid+1; 34 else r=mid-1; 35 } 36 return ans; 37 } 38 void init()//首先求出以每个数为开头上升序列长度,即倒着做最长下降子序列 39 { 40 scanf("%d",&n); 41 for(int i=1;i<=n;i++) 42 scanf("%d",&a[i]); 43 for(int i=n;i;i--) 44 { 45 int t=find(a[i]); 46 f[i]=t+1; 47 cnt=max(cnt,t+1); 48 if(best[t+1]<a[i]) 49 best[t+1]=a[i]; 50 } 51 } 52 int main() 53 { 54 init(); 55 56 scanf("%d",&m); 57 int x; 58 for(int i=1;i<=m;i++) 59 { 60 scanf("%d",&x); 61 if(x<=cnt) solve(x); 62 else puts("Impossible"); 63 } 64 }
puts输出换行。
转载于:https://www.cnblogs.com/fengzhiyuan/p/7444515.html
bzoj1046 [HAOI2007]上升序列相关推荐
- bzoj1046[HAOI2007]上升序列
1046[HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5497 Solved: 1915 [Submit][Stat ...
- 2014.8.15模拟赛【公主的工作】bzoj1046[HAOI2007]上升序列
bzoj题目是这样的 Description 对于一个给定的S={a1,a2,a3,-,an},若有P={ax1,ax2,ax3,-,axm},满足(x1 < x2 < - < xm ...
- bzoj1046(HAOI2007)上升序列
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1046 可贪心.关键是知道每个点最长能否>=x.所以先倒着做一个最长下降子序列就行了. ...
- Bzoj 1046: [HAOI2007]上升序列 二分,递推
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3671 Solved: 1255 [Submit][St ...
- BZOJ 1046: [HAOI2007]上升序列(LIS)
题目挺坑的..但是不难.先反向做一次最长下降子序列.然后得到了d(i),以i为起点的最长上升子序列,接下来贪心,得到字典序最小. ----------------------------------- ...
- BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4987 Solved: 1732 [Submit][St ...
- bzoj 1046: [HAOI2007]上升序列
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4860 Solved: 1692 [Submit][St ...
- [HAOI2007]上升序列
题目:BZOJ1046.洛谷P2215.codevs1714. 题目大意:对于一个给定的S={a1,a2,a3,-,an},若有P={$a_{x1},a_{x2},a_{x3},-,a_{xm}$}, ...
- [BZOJ 1046] [HAOI2007] 上升序列 【DP】
题目链接:BZOJ - 1046 题目分析 先倒着做最长下降子序列,求出 f[i],即以 i 为起点向后的最长上升子序列长度. 注意题目要求的是 xi 的字典序最小,不是数值! 如果输入的 l 大于最 ...
最新文章
- c1xx: fatal error C1356: 无法找到 mspdbcore.dll
- _ISD-SMG518L2CT-F 海康威视测温人脸安检门 温度精度±0.5℃ 人脸抓拍金属探测
- Windows2003如何安装IIS
- Hadoop入门(五)IO操作
- 【HDU - 5876】Sparse Graph(补图bfs,STLset)
- python程序设计与应用第1章
- MyEclipse中对项目分类管理
- 更靠谱的横竖屏检测方法
- Sync Framework 词汇表
- 安装python报错:Detected Windows 7 SP1 without KB2533623
- KAKASI - 将日文转换为平假名/片假名/罗马音
- mac mysql dmg_在mac下使用DMG安装Mysql
- 英语不规则动词变化表
- python如何写日志_python写日志
- 百度编辑器-Ueditor-上传图片的配置
- Codeforces469div2F curfew(贪心)
- 为河南小伙恩辉舍己救人点赞<原创>
- jijinghao-瞄准镜
- Python练习题——coffee
- 郑豪8.6非农数据提前布局,黄金是延续跌势还是多头反击?美盘操作建议
热门文章
- 什么是NSAssert?
- MATLAB建立图表的基础
- Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:预先加载和延迟加载...
- Windows7和Ubuntu9.10完美硬盘安装(2)
- CreatObject方法参数查询
- 使用IBM WID 建立SOA 之WID简介
- 的稳定性 linux_Linux系统KDE桌面,打造最接近Windows的界面环境!不用才后悔
- 蓝桥杯 ADV-239 算法提高 P0102
- 蓝桥杯 ALGO-150 算法训练 6-1 递归求二项式系数值
- python后端开发书籍_后端书籍推荐