BZOJ 1046 上升序列
来源:互联网 发布:网络信息安全工作总结 编辑:程序博客网 时间:2024/06/05 11:19
题目大意:
在给出的序列中,求长度为L的字典序最小上升序列。
解题思路:
设构造到第i个数,显然当且仅当已选的数的个数+以第i个数开头的最长上升子序列的长度≥L时,第i个数在最优解中.
首先求出以每个数为开头上升序列长度,即倒着做最长下降子序列。
如果以第一个数(字典序最小的数)开头的最长上升子序列大等于x,则将它放在答案第一个,第二个数开头小于x,则舍弃,第三个大于x-1,放答案第二个,以此类推
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include <map>#include<vector>#include<set>#define LL long long#define db double#define EPS 1e-15#define inf 1e16#define pa pair<int,int>using namespace std;LL read(){ LL x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int n,m,cnt;int a[100005],f[100005],best[100005];void solve(int x){int last=0;for(int i=1;i<=n;i++)if(f[i]>=x&&a[i]>last){printf("%d",a[i]);if(x!=1)printf(" ");last=a[i];x--;if(!x)break;}printf("\n");}int find(int x){int l=1,r=cnt,ans=0;while(l<=r){int mid=(l+r)>>1;if(best[mid]>x)ans=mid,l=mid+1;else r=mid-1;}return ans;}void pre(){for(int i=n;i;i--){int t=find(a[i]);f[i]=t+1;cnt=max(cnt,t+1);if(best[t+1]<a[i])best[t+1]=a[i];}}int main(){n=read();for(int i=1;i<=n;i++)a[i]=read();pre();m=read();for(int i=1;i<=m;i++){int x=read();if(x<=cnt)solve(x);else puts("Impossible");}return 0;}
其实N^2也能水过(
#include <cstdio>const int N=10010;int n,m;int a[N],b[N],f[N],g[N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1,j=n;i<=n;i++,j--) b[i]=a[j]; for(int i=1;i<=n;i++){ g[i]=1; for(int j=1;j<i;j++){ if(b[j]>b[i]&&g[j]+1>g[i]) g[i]=g[j]+1; } } for(int i=1,j=n;i<=n;i++,j--) f[i]=g[j]; scanf("%d",&m); for(int i=1;i<=m;i++){ int l,last=0; scanf("%d",&l); for(int j=1;j<=n&&l;j++){ if(f[j]>=l&&a[j]>last){ printf("%d%c",a[j],--l?' ':'\n'); last=a[j]; } } if(l) printf("Impossible\n"); } return 0;}
0 0
- BZOJ 1046 上升序列
- BZOJ 1046: [HAOI2007]上升序列
- BZOJ 1046: [HAOI2007]上升序列
- BZOJ 1046: [HAOI2007]上升序列
- 【BZOJ 1046】 [HAOI2007]上升序列
- bzoj 1046: [HAOI2007]上升序列
- BZOJ 1046: [HAOI2007]上升序列
- BZOJ 1046: [HAOI2007]上升序列
- BZOJ 1046 [HAOI2007]上升序列
- bzoj 1046: [HAOI2007]上升序列
- [bzoj]1046: [HAOI2007]上升序列
- bzoj 1046 [HAOI2007] 上升序列 题解
- bzoj 1046: [HAOI2007]上升序列 LIS
- BZOJ 1046 HAOI 2007 上升序列 DP
- BZOJ 1046 洛谷 P2215 [HAOI2007] 上升序列
- 【BZOJ 1046】[HAOI2007]上升序列 lis
- BZOJ 1046: [HAOI2007]上升序列 暴力,二分
- 【BZOJ 1046】【HAOI 2007】上升序列
- 详解Android中AsyncTask的使用
- PAT(B) 1005. 继续(3n+1)猜想
- C++类构造函数初始化列表
- HDU 5423 Rikka with Tree(简单DFS+枚举)
- AlertDialog中EditText输入法调不出 edittext调用输入法等问题
- BZOJ 1046 上升序列
- JavaScript学习笔记4-闭包
- SharedPreference使用指导
- 关于“以管理员身份运行”。。。
- 【Leetcode】subsets2T
- outlook HTML签名制作方法
- LA_3602_DNAConsensusString
- Hadoop/spark安装实战(系列篇1)准备安装包
- 静态查找表