首先这肯定是一道LIS的变形,这次求的是方案,还要求字典序最小

(注意这个字典序最小是指下标最小而不是数最小)

首先预处理以每个数为首,能组成多长的上升序列(这里我们用单调队列解决)

然后按照位置顺序扫一遍顺出可行即可

要注意每行末的空格

 1 var f,a,q:array[0..10010] of longint;
 2     n,k,i,x,j,t,l,r,m:longint;
 3 begin
 4   readln(n);
 5   for i:=1 to n do
 6     read(a[i]);
 7   a[0]:=2147483647;
 8   for i:=n downto 1 do
 9   begin
10     if (a[q[t]]>a[i]) then
11     begin
12       inc(t);
13       q[t]:=i;
14       f[i]:=t;
15     end
16     else begin
17       l:=1;
18       r:=t;
19       while l<=r do
20       begin
21         m:=(l+r) shr 1;
22         if (a[q[m]]<=a[i]) and (a[q[m-1]]>a[i]) then break;
23         if (a[q[m]]<=a[i]) then r:=m-1 else l:=m+1;
24       end;
25       f[i]:=f[q[m]];
26       q[m]:=i;
27     end;
28   end;
29   readln(k);
30   for i:=1 to k do
31   begin
32     readln(x);
33     j:=1;
34     t:=-2147483647;
35     while (j<=n) and (x>0) do
36     begin
37       if (f[j]>=x) and (a[j]>t) then
38       begin
39         write(a[j]);
40         if x<>1 then write(' ');
41         dec(x);
42         t:=a[j];
43       end;
44       inc(j);
45     end;
46     if x>0 then writeln('Impossible')
47     else writeln;
48   end;
49 end.
View Code

 

posted on 2014-07-19 20:48  acphile  阅读(177)  评论(0编辑  收藏  举报