zoukankan      html  css  js  c++  java
  • bzoj1046

    首先这肯定是一道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
  • 相关阅读:
    [DDCTF 2019]homebrew event loop
    [极客大挑战 2019]FinalSQL
    $[HAOI2008]$硬币购物
    $2018/8/19 = Day5$学习笔记 + 杂题整理
    $2018/8/16 = Day2$学习笔记$+$杂题整理
    [NOIp2009] $Hankson$の趣味题
    2018清北学堂夏日培训游记
    2.数组的声明和创建
    1.什么是数组?
    15.递归
  • 原文地址:https://www.cnblogs.com/phile/p/4473193.html
Copyright © 2011-2022 走看看