深夜のシリーズは、彼はその後、秋にはLOJにやった、と夏のタイトルがLuogu上のビットを支払うことを今日している見に行ったと言って、説明を書かれ、修復するために迅速に問題に対する書面による解決策を見つけていない、と
良い話題ああ水余談のAPIO2015ようにするには
まずビットまたはプロセスを検討し、それが低いビットに高いから明らかである貪欲、取るために、このポテンシャルエネルギーを作ってみる(\ 0)\、その後、裁判官はこの1つはために取ることができる方法を検討することである(\ 0 \ )プロセスの
状態を直接配置検討(F_ {I、J} \ \) フロント表す\(Iは\)に番号を\(J \)の条件を満たし、そして最終的に見えるセグメント\(F_ {N、I} (iは\ [A、B]内)\ ) がある場合、\(1 \)に
その後、転送も非常に簡単で、どのような接頭辞を記録した後、前方の転送点を列挙し、このセクションと、この1には、する必要があります\(0 \)この期間を選択すると、より大きな答えることはできませんが、これを見ます転送コード
だから我々は今持っている\(O(N ^ 3 \ログ\和Y_I)\) 最初の4つのサブタスクによってアプローチを、
それでは、臨時最初の5人のサブタスクの何を見てみましょう、よく見るが、それを見つけるでしょう(= 1 \ A)\!
だから、それが答えの下限と考えられているが、我々は今、別々に計算セグメントの最小数の直接の配慮を考慮していないので、DPが遅い理由は、より少ないかどうかを判断することは明らかである前に\(Bが\)することができ、同じ方法をして転送します上記と同様
したがって、このセクションの複雑さがある\(O(N ^ 2 \ログ\和Y_I)\) この問題に統合することができ、どちらも、
#include<cstdio>
#include<iostream>
#include<cstring>
#define RI register int
#define CI const int&
using namespace std;
const int R=40,N=2005;
int n,l,r,a[N]; long long ans;
namespace Case1 //n<=100 solver
{
const int MN=105;
bool f[MN][MN];
inline bool check(CI idx)
{
RI i,j,k; memset(f,0,sizeof(f));
for (f[0][0]=i=1;i<=n;++i) for (j=1;j<=i;++j)
{
long long sum=a[i]; for (k=i-1;~k;--k)
f[i][j]|=f[k][j-1]&&(!((sum>>idx)&1))&&((((sum>>idx)<<idx)|ans)==ans),sum+=a[k];
}
bool flag=0; for (i=l;i<=r;++i) flag|=f[n][i]; return flag;
}
};
namespace Case2 //l=1 solver
{
int f[N];
inline bool check(CI idx)
{
RI i,j; for (memset(f,127,sizeof(f)),f[0]=0,i=1;i<=n;++i)
{
long long sum=a[i]; for (j=i-1;~j;--j)
{
if ((!((sum>>idx)&1))&&((((sum>>idx)<<idx)|ans)==ans))
f[i]=min(f[i],f[j]+1); sum+=a[j];
}
}
return f[n]<=r;
}
};
int main()
{
RI i; for (scanf("%d%d%d",&n,&l,&r),i=1;i<=n;++i) scanf("%d",&a[i]);
for (i=40;~i;--i) if (!(n<=100?Case1::check(i):Case2::check(i))) ans|=(1LL<<i);
return printf("%lld",ans),0;
}