牛客练习赛22-C-dp+bitset

链接:https://www.nowcoder.com/acm/contest/132/C
来源:牛客网

题目描述

一共有 n个数,第 i 个数是 xi 
xi 可以取 [li , ri] 中任意的一个值。
,求 S 种类数。

输入描述:

第一行一个数 n。 
然后 n 行,每行两个数表示 l
i
,r
i
 

输出描述:

输出一行一个数表示答案。
示例1

输入

复制
5
1 2
2 3
3 4
4 5
5 6

输出

复制
26

备注:

1 ≤ n , l
i
 , r
i
 ≤ 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 }

 

posted @ 2018-07-14 13:26  *zzq  阅读(313)  评论(0编辑  收藏  举报