牛客练习赛22 C.简单瞎搞题 bitset优化

C.简单瞎搞题

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

来源:牛客网

题目描述

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

输入描述:

第一行一个数 n。 
然后 n 行,每行两个数表示 li,ri

输出描述:

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

//bitset快速的位运算符类似,不过他是真的每一位都是0,1,
//本题中最大总和为1e6,那么就可以开一个1e6大小的bitset,第i为代表i这个数是否可以被组成
//bit.reset()全部变0,bit.count()有几个1,
//bitset可以节省内存,1/64,可以节省时间,1/64
//一般1e7的数组int的话是32兆,用bool小4倍
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
bitset <maxn> a,b;  //bitset开的是正常内存的1/64
int main()
{
    int n;
    scanf("%d",&n);
    b[0]=1; //0是可以直接取到的,不能省略,否则答案永远为0
    for(int i=1;i<=n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        for(int j=l;j<=r;j++)   //能取的数是从l到r
        {
            a|=b<<(j*j); //bitset中<<是指向右移  是指>>向左移,与位运算相反
        }
        b=a;          //滚动使用两个bitset
        a.reset();   //全部填0
    }
    printf("%d\n",b.count());  //输出有几个1,就是所有可能,这是bitset的函数,复杂度为(长度/64)
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41037114/article/details/81039646
今日推荐