分组赛讲课讲了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.