牛客练习赛 22 c 【bitset

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

题目描述

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

输入描述:

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

输出描述:

输出一行一个数表示答案。
#include "bits/stdc++.h"
#define maxx 1000009
using namespace std;
bitset<maxx>dp[105];  
int main(){
    int n,l,r;
    cin>>n;
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        cin>>l>>r;
        dp[i].reset();
        for(int j=l;j<=r;j++){
            dp[i]=dp[i]|(dp[i-1]<<j*j);  //左移动j*j,相当于加上j*j(位置往前移动j*j位)
        }
    }
    cout<<dp[n].count()<<endl;
    return 0;
}

遍历每个区间的值,使他们相加,从0个位置开始,数组中的第i位表示为可组成的数i,将第i位置0【可组成的数=1所在的位置数】,用count()计算出bitset里面含有的1的个数,则是可以组成的所有数的个数


初始化bitset对象的方法

bitset<n> b;

bn位,每位都为0

bitset<nb(u);

bunsigned longu的一个副本

bitset<nb(s);

bstring对象s中含有的位串的副本

bitset<nb(sposn);

bs中从位置pos开始的n个位的副本

bitset操作

b.any()

b中是否存在值为1的二进制位?

b.none()

b中不存在值为1的二进制位吗?

b.count()

b中值为1的二进制位的个数

b.size()

b中二进制位的个数

b[pos]

访问b中在pos处的二进制位

b.test(pos)

b中在pos处的二进制位是否为1

b.set()

b中所有二进制位的值为1

b.set(pos)

b中在pos处的二进制位值为1

b.reset()

b中所有二进制位的值为0

b.reset(pos)

b中在pos处的二进制位值为0

b.flip()

b中所有二进制位逐位取反

b.flip(pos)

b中在pos处的二进制位取反

b.to_ulong()

b中同样的二进制位返回一个unsigned long

os << b

b中的位集输出到os



猜你喜欢

转载自blog.csdn.net/cheung99857/article/details/81062358