【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终于放下了对名利的追逐,找到了人生的意义——吃吃吃。从此,他们过上了幸福快乐的生活……

 

posted on 2017-10-12 19:51  myx12345  阅读(263)  评论(0编辑  收藏  举报

导航