bzoj1046 HAOI2007 上公升序列

2021-07-28 02:27:48 字數 1002 閱讀 9119

傳送門

首先我們可以倒著做一次最長下降序列,記錄以x結尾的最長下降序列的長度。

然後反過來,我們就有了以x開頭的最長上公升序列的長度。

我們正著推過去,可以知到當長度大於x是這個點可選,此時長度-1,輸出答案。

有點說不清楚,沒看懂的請轉彎

var

a,f:array [0..10005] of longint;

n,i,j,max,m,l,last:longint;

begin

read(n);

for i:=1

to n do

read(a[i]);

for i:=1

to n do f[i]:=1;

for i:=n-1

downto1do

for j:=i+1

to n do

if (a[i]and (f[i]1) then f[i]:=f[j]+1;

max:=0;

for i:=1

to n do

if (f[i]>max) then max:=f[i];

read(m);

for i:=1

to m do

begin

read(l);

if (l>max) then

begin writeln('impossible'); continue; end;

last:=0;

for j:=1

to n do

if (f[j]>=l) and (a[j]>last) then

begin

write(a[j]); if (l<>1) then

write(' ');

last:=a[j]; dec(l);

if (l=0) then

break;

end;

writeln;

end;

end.

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