牛客练习赛22--C-简单瞎搞题(bitset 基础用法)

一共有 n个数,第 i 个数是 xi 

xi 可以取 [li , ri] 中任意的一个值。

设 ,求 S 种类数。

输入描述:

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

输出描述:

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

输入

复制

5
1 2
2 3
3 4
4 5
5 6

输出

复制

26

备注:

1 ≤ n , li , ri ≤ 100

Bitset的基础用法及解释:

初始化bitset对象的方法

bitset 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

 

 哇咔咔咔~~我要重新解释了!!!

题意:每个区间之间的任意一个数的平方之和,例如:一。1 ~ 2    二。 3 ~ 4  三。 5 ~ 6  有三个区间

在三个区间里分别挑挑一个2^2 , 3^2 , 5^2 , 那么  2^2 + 3^2  +  5^2 = K就是一种方法(答案相同的话算一种), 求K共有多少种?

答案:

(解释bitset : 0 0 0 1 0 1 , 前面这组数据表示的是1可以凑到, 3也可以凑到, 谁的下标为1 表示他可以凑到)

首先bitset ans 和 t , 原先令ans[0 ]= 1

样例1: 1 ~ 2

               2 ~ 3

               3 ~ 4

那 t = 1 0 0 1    (1 ^ 2 = 1 ... 2^2 = 4)

下一步左移4的时候和 t 或(|)一下 , 然后赋给ans,再将 t 全部变成 0 (0和任何数或都是它本身)

最后ans里所有为1 的就表示它可以被凑出来

看代码啦~~(解释在代码里)

#include 
using namespace std;
bitset<1000005> ans, t;
int n;
int main()
{
    scanf("%d",&n);
    ans[0] = 1;
    for (int i = 0; i < n; i++)
    {
        int l ,r; scanf("%d%d", &l, &r);
        t.reset();  //把t中所有二进制的值都变为0 
        for (int j = l; j <= r; j++) t |= (ans<

你可能感兴趣的:(牛客练习赛22--C-简单瞎搞题(bitset 基础用法))