BZOJ 1046 HAOI2007 上公升序列

2022-05-21 06:38:58 字數 2177 閱讀 9635

time limit: 10 sec  memory limit: 162 mb

submit: 5290  solved: 1831

[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

題解:好久沒有寫部落格了,最近考試比較多……

這個題目我們肯定是想著如果求出以i開頭的最長上公升子串行的長度就好了,有了這個陣列我們就顯然可以列印出整個序列了。

所以我們考慮倒著dp出以i開頭的最長下降子串行的長度,那麼就是上面寫的正著的以i開頭的最長上公升子串行的長度,dp的時候寫一顆值域線段樹優化一下就可以了。

然後我們怎麼列印呢,檢查一下最優子結構就可以了,從第一位開始,當前要求長度為x,如果dp[i]>=x&&v[i]>上一位所選的數,那麼這個數就是合法的,並且一定是最優的,我們將x--,表示,因為已經選了一位了,下一位就只需要長度為x-1就可以了。

**:

#include #include 

#include

#include

#include

#include

#define maxn 101000

using

namespace

std;

intdp[maxn];

intv[maxn],b[maxn];

struct

treea[maxn*4

];int

n,q;

void build(int xv,int l,int

r) a[xv].l=l,a[xv].r=r;

int mid=(l+r)/2

; build(xv*2,l,mid),build(xv*2+1,mid+1

,r);

a[xv].mx=max(a[xv*2].mx,a[xv*2+1

].mx);

}int query(int xv,int l,int

r)

if(r<=mid) return query(xv*2

,l,r);

else

if(l>mid) return query(xv*2+1

,l,r);

return max(query(xv*2,l,mid),query(xv*2+1,mid+1

,r));

}void insert(int xv,int ps,int

x)

if(ps<=mid) insert(xv*2

,ps,x);

else insert(xv*2+1

,ps,x);

a[xv].mx=max(a[xv*2].mx,a[xv*2+1

].mx);

}int

main()

sort(b+1,b+n+1

);

int k=unique(b+1,b+n+1)-b-1

;

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

build(

1,1,k+1

);

for(int i=n;i>=1;i--)

scanf("%d

",&q);

while(q--)

if(x==0) break

; }

if(x!=0

) puts(

"");

}return0;

}

BZOJ 1046 HAOI 上公升序列

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

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