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 }