Loj 515 贪心只能过样例

$bitset$ 优化 $dp$ .

考虑最朴素的 $dp$ , $f(i,j)$ 表示考虑前 $i$ 个数,能否使得 $S=j$ .

转移时枚举当前这一位选哪一个数,这样直接做的时间复杂度是 $O(n^5)$ .

因为只有 $0/1$ 运算,第二维的最大值为 $10^6$ ,用 $bitset$ 优化,复杂度变成 $O(\frac {n^5} {64})$ ,就可以过了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
fh=-1,jp=getchar();
while (jp>='0'&&jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*fh;
}
const int MAXN=101;
int n;
bitset<MAXN*MAXN*MAXN> f,lst;
int main()
{
n=read();
lst[0]=1;
for(int i=1;i<=n;++i)
{
int L=read(),R=read();
f.reset();
for(int x=L;x<=R;++x)
f|=lst<<(x*x);
lst=f;
}
cout<<f.count()<<endl;
return 0;
}