E 简单瞎搞题 有关bitset的用法

链接:https://ac.nowcoder.com/acm/contest/5556/E

题意:求出不同答案的种类数;

思路:一开始看到这样的题,我们可以采用01背包的做法,找出装这个背包的所有可能性

   用dp[100][1e6]  来表示

   很明显,会超空间,于是我们可以采用滚动数组的方式,将第一维给省去,这样就不会超空间了

   但是,100*100*1e6 还是会超时的

   于是,有一个好用的东西 bitset

   关于bitset的用法功能,不懂的先百度

   转移方程为:temp |= ans << (j*j);

 1 #include <bits/stdc++.h>
 2 #include <bitset>//用bitset要加这个头文件
 3 typedef long long LL;
 4 #define pb push_back
 5 const int INF = 0x3f3f3f3f;
 6 const double eps = 1e-8;
 7 const int mod = 1e9+7;
 8 const int maxn = 1e5+10;
 9 using namespace std;
10 
11 bitset<1000005> ans,temp;
12 
13 int main()
14 {
15     #ifdef DEBUG
16     freopen("sample.txt","r",stdin); //freopen("data.out", "w", stdout);
17     #endif
18 
19     int n;
20     scanf("%d",&n);
21     ans.set(0); //为了后面更新值,最初让0在ans集合中
22     for(int i=1;i<=n;i++){
23         int l,r;
24         scanf("%d %d",&l,&r);
25         temp.reset();//让temp所有位都为0
26         for(int j=l;j<=r;j++)
27             temp |= ans << (j*j);
28         ans=temp;
29     }
30     printf("%d\n",ans.count());//输出ans中位上是1的个数
31 
32     return 0;
33 }
View Code

 

posted @ 2020-05-07 16:05  古比  阅读(158)  评论(0编辑  收藏  举报