zoukankan      html  css  js  c++  java
  • bzoj3721

    不是说好的20s吗,怎么我19s都超时……逗我
    最后还得写成c++才能过……
    首先不难发现询问肯定是O(1)的复杂度
    我们先把奇数和偶数分开排序,不难发现几个性质
    1. 奇数的个数一定是奇数
    2. 奇数选取随k成单调增
    然后就能在O(n)的时间预处理了……

     1 type arr=array[0..1000010] of int64;
     2 var a,b,f:arr;
     3     j,i,n1,n2,n,m,x:longint;
     4     ch:boolean;
     5 
     6 procedure qsort(var a:arr;n:longint);
     7   procedure sort(l,r: longint);
     8     var i,j: longint;
     9         x,y:int64;
    10     begin
    11       i:=l;
    12       j:=r;
    13       x:=a[(l+r) div 2];
    14       repeat
    15         while a[i]>x do inc(i);
    16         while x>a[j] do dec(j);
    17         if not(i>j) then
    18         begin
    19           y:=a[i];
    20           a[i]:=a[j];
    21           a[j]:=y;
    22           inc(i);
    23           j:=j-1;
    24         end;
    25       until i>j;
    26       if l<j then sort(l,j);
    27       if i<r then sort(i,r);
    28     end;
    29 
    30   begin
    31     sort(1,n);
    32   end;
    33 
    34 begin
    35   readln(n);
    36   for i:=1 to n do
    37   begin
    38     read(x);
    39     if x mod 2=1 then
    40     begin
    41       inc(n1);
    42       a[n1]:=x;
    43     end
    44     else begin
    45       inc(n2);
    46       b[n2]:=x;
    47     end;
    48   end;
    49   qsort(a,n1);
    50   qsort(b,n2);
    51   for i:=1 to n1 do
    52     a[i]:=a[i-1]+a[i];
    53   for i:=1 to n2 do
    54     b[i]:=b[i-1]+b[i];
    55   if n1=0 then
    56     f[1]:=-1
    57   else f[1]:=a[1];
    58   i:=1;
    59   j:=1;
    60   while i<n do
    61   begin
    62     inc(i);
    63     f[i]:=-1;
    64     while (i-j>n2) and (j<=n1) do j:=j+2;
    65     ch:=false;
    66     while (j<=n1) and (i-j>=0) and (f[i]<a[j]+b[i-j]) do
    67     begin
    68       f[i]:=a[j]+b[i-j];
    69       j:=j+2;
    70       ch:=true;
    71     end;
    72     if ch then j:=j-2;
    73   end;
    74   readln(m);
    75   for i:=1 to m do
    76   begin
    77     readln(x);
    78     writeln(f[x]);
    79   end;
    80 end.
    View Code
  • 相关阅读:
    法院
    Spring Cloud常用组件
    PowerShell使用教程
    浅谈3DES加密解密
    SC win consul
    SB-Token-Jwt
    前端MVC Vue2学习总结
    spring-session-data-redis
    SpringBoot WS
    SpringBoot之使用Spring Session集群-redis
  • 原文地址:https://www.cnblogs.com/phile/p/4473096.html
Copyright © 2011-2022 走看看