链接:https://www.nowcoder.com/acm/contest/132/C
来源:牛客网
题目描述
一共有 n个数,第 i 个数是 xi
xi 可以取 [li , ri] 中任意的一个值。
设 ,求 S 种类数。输入描述:
第一行一个数 n。i
然后 n 行,每行两个数表示 l
,ri。
输出描述:
输出一行一个数表示答案。
备注:
1 ≤ n , li
, ri
≤ 100
推出了方程但是复杂度太高想不出优化,后来才知道是bitset,一直没用过这个= =
f[i][j]表示累加完第i个数之后S为j是否可行,由于只涉及0和1所以考虑bitset优化瞎搞。
1 #include<bits/stdc++.h> 2 using namespace std; 3 bitset<1000010>f[2]; 4 int l[110],r[110]; 5 int main(){ 6 int n,i,j,k; 7 while(cin>>n){ 8 for(i=1;i<=n;++i) cin>>l[i]>>r[i]; 9 f[0][0]=1; 10 for(i=1;i<=n;++i){ 11 f[i%2]=0; 12 for(j=l[i];j<=r[i];++j){ 13 f[i%2]|=(f[(i%2)^1]<<(j*j)); 14 } 15 } 16 cout<<f[n%2].count()<<endl; 17 } 18 return 0; 19 }