BZOJ 1046 HAOI 上公升序列

2022-08-16 17:21:11 字數 1379 閱讀 6467

1046

: [haoi2007]上公升序列

time limit:

10 sec memory limit: 162

mbsubmit:

5376 solved: 1862

[submit][status][discuss]

description

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

2< …

出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 input63

4123

6364

5sample output

impossible12

36impossible

題目首先與處理出來f[i]表示以i為開頭向後延伸的最長上公升序列的長度

題目要求的是下標的字典序最小,貪心即可

從前往後列舉i,如果f[i]>剩餘的長度,那麼就選i,並讓剩餘的長度--

注意:不要多輸出空格,不然會presentation_error

1 #include 2

using

namespace

std;

3 inline int

read()

6while(isdigit(ch))

7return x*f;8}

9const

int maxn=1e6+10;10

intf[maxn],a[maxn],n,maxl;

11void

init()16}

17void

solve()

22 f[i]++;

23 maxl=max(f[i],maxl);24}

25int m=read();

26for(int i=1;i<=m;i++)

31int l=-1000;32

for(int j=1;j<=n;j++)

41}

42 cout<

44}45int

main()

view code

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...

bzoj1046 HAOI2007 上公升序列

傳送門 首先我們可以倒著做一次最長下降序列,記錄以x結尾的最長下降序列的長度。然後反過來,我們就有了以x開頭的最長上公升序列的長度。我們正著推過去,可以知到當長度大於x是這個點可選,此時長度 1,輸出答案。有點說不清楚,沒看懂的請轉彎 var a,f array 0.10005 of longint...