分组赛讲课讲了APIO2015的题,于是回去就做完了

稍微写一点题解吧

bzoj4069 逐位处理的简单题,然后就是bool型dp

然后a=1 的时候可以把一位状态干掉

当一维状态单调且是bool型dp时,我们可以用dp表示这一维状态;类似的思想也在bzoj1937出现过

 1 var s:array[0..2010] of int64;
 2     n,a,b,i,j,k,p:longint;
 3     g,c:array[0..2010] of longint;
 4     f:array[0..110,0..110] of boolean;
 5     now:int64;
 6     can:boolean;
 7 
 8 function min(a,b:longint):longint;
 9   begin
10     if a>b then exit(b) else exit(a);
11   end;
12 
13 begin
14   readln(n,a,b);
15   for i:=1 to n do
16   begin
17     read(c[i]);
18     s[i]:=s[i-1]+c[i];
19   end;
20   if a=1 then
21   begin
22     for p:=40 downto 0 do
23     begin
24       now:=now or int64(1) shl int64(p);
25       g[0]:=0;
26       for i:=1 to n do
27         g[i]:=n+1;
28       for i:=1 to n do
29         for j:=1 to i do
30         begin
31           if (s[i]-s[j-1]) and now>0 then continue;  //当前模板是0就不能为1,是1就随意,这里转化一下方便快速匹配
32           g[i]:=min(g[i],g[j-1]+1);
33         end;
34       if g[n]>b then
35         now:=now xor int64(1) shl int64(p);
36     end;
37   end
38   else begin
39     for p:=40 downto 0 do
40     begin
41       now:=now or int64(1) shl int64(p);
42       fillchar(f,sizeof(f),false);
43       f[0,0]:=true;
44       for i:=1 to n do
45         for j:=1 to n do
46           for k:=1 to i do
47             if f[k-1,j-1] then
48             begin
49               f[i,j]:=((s[i]-s[k-1]) and now=0);
50               if f[i,j] then break;
51             end;
52 
53       can:=false;
54       for i:=a to b do
55         if f[n,i] then
56         begin
57           can:=true;
58           break;
59         end;
60       if not can then now:=now xor int64(1) shl int64(p);
61     end;
62   end;
63   for p:=40 downto 0 do
64     now:=now xor int64(1) shl int64(p);
65   writeln(now);
66 end.
4069

相关文章:

  • 2021-11-20
  • 2021-11-03
  • 2022-12-23
  • 2021-10-24
  • 2021-12-29
  • 2022-12-23
  • 2022-01-05
  • 2021-06-29
猜你喜欢
  • 2022-01-28
  • 2021-10-28
  • 2021-06-03
  • 2021-08-30
  • 2021-09-25
  • 2021-11-14
相关资源
相似解决方案