1046 HAOI2007 上公升序列

2022-05-16 05:50:04 字數 1126 閱讀 9992

time limit: 10 sec  memory limit: 162 mb

submit: 5822  solved: 2071

[submit][status][discuss]

對於乙個給定的s=,若有p=,滿足(x1 < x2 < … < xm)且( ax1 < ax

2 < … < axm)。那麼就稱p為s的乙個上公升序列。如果有多個p滿足條件,那麼我們想求字典序最小的那個。任務給

出s序列,給出若干詢問。對於第i個詢問,求出長度為li的上公升序列,如有多個,求出字典序最小的那個(即首先

x1最小,如果不唯一,再看x2最小……),如果不存在長度為li的上公升序列,則列印impossible.

第一行乙個n,表示序列一共有n個元素第二行n個數,為a1,a2,…,an 第三行乙個m,表示詢問次數。下面接m

行每行乙個數l,表示要詢問長度為l的上公升序列。n<=10000,m<=1000

對於每個詢問,如果對應的序列存在,則輸出,否則列印impossible.

63 4 1 2 3 636

45impossible

1 2 3 6

impossible

首先因為字典序要最小,所以要在前面的數字開頭,但是按照最長上公升子串行做法只能是後面的數字結尾,如果倒過來做最長下降子串行不就變成了前面數字開頭了嗎?

列舉每乙個數字作為開頭時,最長子序列長度,這裡資料量比較小,可以用n2做法

然後首先判斷提問,是否存在長度大於等於l的序列,記錄最長序列的長度判斷一下

1 #include2 #include3

using

namespace

std;45

const

int maxn=100000;6

7int

n,m,len;

8int

a[maxn],f[maxn];910

void

lis()

1119}20

21void solve(int

x)22

31 printf("\n"

);32}33

34int

main()

3548

return0;

49 }

1046 HAOI2007 上公升序列

time limit 10 sec memory limit 162 mb submit 4187 solved 1429 submit status discuss description 對於乙個給定的s 若有p 滿足 x1 x2 xm 且 ax1 ax2 axm 那麼就稱p為s的乙個上公升序列...

bzoj 1046 HAOI2007 上公升序列

首先用f i 表示從i開始的最長上公升子串行的長度 注意這裡和平時的不一樣,是以i開頭而不是以1到i 這就相當於倒序做一遍最長下降子串行 然後要用到貪心 首先假設要取長度為x的,如果比算出來的max大 max正序倒序都一樣的 肯定無解 然後從頭開始取,因為從頭取的下標字典序最小,如果a i 比上乙個...

BZOJ1046 HAOI2007 上公升序列

portal 首先是否存在很容易。考慮如何輸出最小字典序的方案。注意。是位子的字典序,不是值。那麼這樣的話,倒過來做一遍最長下降子串行。f i 表示以 i 開頭的最長上公升子串行長度 找答案的時候就順著找,每次滿足條件就輸出。include include include define n 1000...