• 【NOIP2017练习】鏖战字符串(斜率优化DP)


    题意:

    在决胜局中,Abwad决定和nbc鏖战字符串,比的是谁能更快地将一个“量子态的字符串”删除。“量子态的字符串”的每个字符都有一个删除难度dif[i]。“量子态的字符串”非常顽固,只能先分割成若干个子串,然后再通过以下两种方式删除:
    1、假设子串的所有字符的删除难度之和为x,消耗a*x2+b的时间可以将子串扔进回收站。
    2、若子串中出现次数最多的字符出现的次数不少于l次且不多于r次,那么采用“量子态的py自动机”算法可以消耗c*x+d的时间将子串扔进回收站。
    Abwad自然知道最少用多少时间就能将字符串删去,因此,他希望你求出删去每个前缀[1,i]的最少用时。

    对于所有的数据,满足n≤100000,1≤a,b,c,d≤233,1≤l,r≤n,dif[i]≤50,所有字符由小写字母组成。
    思路:lyy题
    老年选手犯了个大错误 DP没求完就在优化决策 结果只WA了1个点
    要我说应该WA光 也许是数据难造

     1 var dp:array[0..110000]of int64;
     2     s:array[0..110000]of int64;
     3     q1,q2,f:array[1..110000]of longint;
     4     l,r:array[1..260]of longint;
     5     n,a,b,c,d,l0,r0,i,x,nowl,nowr,t1,w1,t2,w2,t,j,k:longint;
     6     ch:ansistring;
     7 
     8 function cmp(x,y,z:longint):boolean;
     9 var x1,y1,x2,y2:int64;
    10 begin
    11  x1:=sqr(s[x])*a-sqr(s[y])*a+dp[x]-dp[y];
    12  y1:=s[x]-s[y];
    13  x2:=sqr(s[y])*a-sqr(s[z])*a+dp[y]-dp[z];
    14  y2:=s[y]-s[z];
    15  if x1*y2>=x2*y1 then exit(true);
    16  exit(false);
    17 end;
    18 
    19 function clac(j,i:longint):int64;
    20 begin
    21  exit(dp[j]+sqr(s[i]-s[j])*a+b);
    22 end;
    23 
    24 function min(x,y:int64):int64;
    25 begin
    26  if x<y then exit(x);
    27  exit(y);
    28 end;
    29 
    30 begin
    31  assign(input,'string.in'); reset(input);
    32  assign(output,'string.out'); rewrite(output);
    33  readln(n,a,b,c,d,l0,r0);
    34  readln(ch);
    35  for i:=1 to n do f[i]:=ord(ch[i])-ord('a')+1;
    36  for i:=1 to n do
    37  begin
    38   read(x); s[i]:=s[i-1]+x;
    39  end;
    40  t1:=1; w1:=1; q1[1]:=0; dp[0]:=0;
    41  t2:=1; w2:=0;
    42  nowl:=1; nowr:=0;
    43  for i:=1 to n do
    44  begin
    45   while (t1<w1)and(clac(q1[t1],i)>=clac(q1[t1+1],i)) do inc(t1);
    46   dp[i]:=clac(q1[t1],i);
    47 
    48   inc(l[f[i]]); inc(r[f[i]]);
    49   while l[f[i]]>r0 do
    50   begin
    51    dec(l[f[nowl]]);
    52    inc(nowl);
    53    while (t2<=w2)and(q2[t2]+1<nowl) do inc(t2);
    54   end;
    55   while r[f[i]]>=l0 do
    56   begin
    57    if nowr>0 then
    58    begin
    59     dec(r[f[nowr]]);
    60     if r[f[i]]<l0 then
    61     begin
    62      inc(r[f[nowr]]);
    63      break;
    64     end;
    65    end;
    66    while (t2<=w2)and(dp[nowr]-s[nowr]*c<=dp[q2[w2]]-s[q2[w2]]*c) do dec(w2);
    67    inc(w2); q2[w2]:=nowr;
    68    inc(nowr);
    69   end;
    70   if t2<=w2 then
    71   begin
    72    t:=q2[t2];
    73    dp[i]:=min(dp[i],dp[t]+(s[i]-s[t])*c+d);
    74   end;
    75   while (t1<w1)and cmp(q1[w1-1],q1[w1],i) do dec(w1);
    76   inc(w1); q1[w1]:=i;
    77  end;
    78  for i:=1 to n do writeln(dp[i]);
    79  close(input);
    80  close(output);
    81 end.

    【后记】
    在Abwad和nbc同时将最后一个子串删去时,一个带着黑色方框眼镜,方脸,穿着高腰裤的长者,乘着圣洁的祥云,飞进了YYHS的机房。
    在他伟大的思想的启发下,Abwad和nbc终于放下了对名利的追逐,找到了人生的意义——吃吃吃。从此,他们过上了幸福快乐的生活……

  • 相关阅读:
    路由器配置深入浅出—静态路由和缺省路由配置
    盘点飞思卡尔i.MX多媒体处理器前世今生 (转)
    ubuntu18.04下取消中键复制粘贴功能
    uboot常用命令及其使用
    MCU软件最佳实践——使用printf打印数据
    uboot无法通过nfs加载ubuntu18.04中的文件(转)
    GNU C字节对齐__attribute__((aligned(n))) #pragma pack(n)
    ENDIAN的由来及BIGEDIAN 和LITTLEENDIAN(转)
    自动生成c# Model属性
    使用JAVA生成随机的AES密钥
  • 原文地址:https://www.cnblogs.com/myx12345/p/7657782.html
Copyright © 2020-2023  润新知