• bzoj1046 [HAOI2007]上升序列


    题意

    对于一个给定的(S={a1,a2,a3,…,an}),若有(P={ax1,ax2,ax3,…,axm}),满足((x1 < x2 < … < xm))且((ax1 < ax 2 < … < axm))。那么就称P为S的一个上升序列。如果有多个P满足条件,那么我们想求字典序最小的那个。任务给出(S)序列,给出若干询问。对于第i个询问,求出长度为Li的上升序列,如有多个,求出字典序最小的那个(即首先(x1)最小,如果不唯一,再看(x2)最小……),如果不存在长度为(Li)的上升序列,则打印Impossible.

    题解

    傻逼题。LIS搞。输出贪心。
    其实这份代码会PE

    #include<set>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    inline int read() {
    	int x = 0, flag = 1; char ch = getchar();
    	while (ch > '9' || ch < '0') { if (ch == '-') flag = -1; ch = getchar(); }
    	while (ch <= '9' && ch >= '0') { x = x * 10 + ch - '0'; ch = getchar(); }
    	return x * flag;
    }
    
    #define rep(ii, aa, bb) for (int ii = aa; ii <= bb; ii++)
    #define drp(ii, aa, bb) for (int ii = aa; ii >= bb; ii--)
    #define ll long long
    #define N 10001
    
    int a[N], f[N];
    
    int main() {
    	int n = read(), maxL = 1;
    	rep(i, 1, n) a[i] = read(), f[i] = 1;
    	drp(i, n, 1) drp(j, n, i + 1) if (a[j] > a[i]) maxL = max(maxL, (f[i] = max(f[i], f[j] + 1)));
    	int q = read();
    	while (q--) {
    		int L = read();
    		if (L > maxL) { puts("Impossible
    "); continue; }
    		int mn = 0;
    		rep(i, 1, n) if (f[i] >= L && a[i] > mn) {
    			printf("%d", a[i]); if (L != 1) printf(" ");
    			mn = a[i];  if (--L == 0) break;
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    为什么转速环经过pi调节后输出的是电流?
    如何将mysql、php、nginx设置为开机自启动
    rm-rf /*
    2020/4/23-linux中的定时任务详解
    2020/4/20 一键部署服务
    2020/4/20-ansible一键部署nfs
    2020/4/20-backup之rsync
    2020/4/19-linux中/etc/hosts
    2020/4/18-linux中的selinux
    2020/4/18-linux中的iptables
  • 原文地址:https://www.cnblogs.com/aziint/p/8416130.html
Copyright © 2020-2023  润新知