【牛客练习赛22 C】

https://www.nowcoder.com/acm/contest/132/C

题目大意:在n个区间中取出n个数,相加的和一共会出现多少种结果。

题目分析:对于这种挑选数字相加,由于每一步不同的选择都会影响结果,并且会出现重复的结果,所以很自然地想到使用bitset进行解决..

    【基本操作:使用<<a给每个结果加上a,使用 | (1<<a) 添加一个结果】

【注意使用bitset不会爆位数..而使用(1<<a)的过程可能爆掉..在该题中就爆掉了..可以使用构建新的bitset先 << 再与 原 bitset进行 | 操作】

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     bitset<1000005>fo(0);
 6     bitset<1000005>fo1(0);
 7     bitset<1000005>fo2(0);
 8     bitset<1000005>fo3(0);
 9     int n;
10     scanf("%d",&n);
11     int tot=0;
12     for(int i = 0  ; i < n ; i++){
13         int qwq1,qwq2;
14         scanf("%d%d",&qwq1,&qwq2);
15         fo2=fo1;
16         fo1=fo3;
17         for(int j = qwq1 ; j <= qwq2 ; j++){
18             fo=fo2;
19             bitset<1000005>fo4(1);
20             if(i)
21             fo<<=(j*j);
22             else{
23                 fo4<<=(j*j);
24                 fo|=fo4;
25             }
26             fo1|=fo;
27 
28         }     /*for(int k = 0 ; k <= 1000000 ; k++){
29         if((fo1[k])&(1)){tot++;cout << k <<endl;}*/
30 
31     }
32 
33      for(int i = 0 ; i <= 1000000 ; i++){
34         if(fo1[i]&1){tot++;}
35     }
36     cout << tot << endl;
37     return 0;
38 }
View Code

 

posted @ 2018-07-13 22:55  MekakuCityActor  阅读(162)  评论(0编辑  收藏  举报