zoukankan      html  css  js  c++  java
  • [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的上升序列。N<=10000,M<=1000

    Output

      对于每个询问,如果对应的序列存在,则输出,否则打印Impossible.

    Sample Input

    6
    3 4 1 2 3 6
    3
    6
    4
    5
    

    Sample Output

    Impossible
    1 2 3 6
    Impossible
    

    Solution

    一开始把题看错了,以为要值的字典序最小。。。

    下标最小直接贪心就好了。

    (f[i])表示第(i)个位置开头的最长上升子序列是多少,然后随便写一写就好了。

    (f)树状数组预处理。

    #include<bits/stdc++.h>
    using namespace std;
     
    void read(int &x) {
        x=0;int f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
     
    void print(int x) {
        if(x<0) putchar('-'),x=-x;
        if(!x) return ;print(x/10),putchar(x%10+48);
    }
    void write(int x) {if(!x) putchar('0');else print(x);putchar('
    ');}
    
    const int maxn = 2e5+10;
    
    int a[maxn],n,m,f[maxn],r[maxn],ans;
    
    struct Binary_Indexed_Tree {
    	int t[maxn];
    	void modify(int i,int x) {for(;i<=n;i+=i&-i) t[i]=max(t[i],x);}
    	int query(int i,int ans=0) {for(;i;i-=i&-i) ans=max(ans,t[i]);return ans;}
    }BIT;
    
    void prepare() {
    	for(int i=n;i;i--) f[i]=BIT.query(n-a[i])+1,BIT.modify(n-a[i]+1,f[i]);
    }
    
    void solve(int x) {
    	int lst=0;
    	for(int i=1;i<=n;i++)
    		if(f[i]>=x&&a[i]>lst) {
    			printf("%d ",r[a[i]]);x--;lst=a[i];
    			if(!x) break;
    		}
    	puts("");
    }
    
    int main() {
    	read(n);for(int i=1;i<=n;i++) read(a[i]),r[i]=a[i];
    	sort(r+1,r+n+1);int M=unique(r+1,r+n+1)-r-1;
    	for(int i=1;i<=n;i++) a[i]=lower_bound(r+1,r+M+1,a[i])-r;
    	prepare();read(m);
    	for(int i=1;i<=n;i++) ans=max(ans,f[i]);
    	for(int i=1,x;i<=m;i++) {
    		read(x);
    		if(x<=ans) solve(x);
    		else puts("Impossible");
    	}
    	return 0;
    }
    
  • 相关阅读:
    信息属性列表关键字 info.plist
    UTI iPhone支持依文件后缀名打开应用
    XCode环境变量及路径设置
    Undefined symbols for architecture i386:和"_OBJC_CLASS_$_xx", referenced from:问题解决方法
    SAP GUI里的收藏夹事务码管理工具
    SAP ABAP Netweaver里的SE80事务码是如何响应用户请求的
    SAP CRM My Opportunity Fiori应用网络请求的详细分析
    SAP官方到底提供了免费的S/4HANA试用版没有?
    介绍一种Fiori标准应用的增强方式
    一个基于SAP Hybris Commerce和微信的社交电商原型介绍
  • 原文地址:https://www.cnblogs.com/hbyer/p/10384269.html
Copyright © 2011-2022 走看看