集训队日常训练20181201 C 1003 : 种类数

时间限制(普通/Java):2000MS/6000MS     内存限制:65536KByte
总提交: 8            测试通过:5

描述

一共有 n个数,第 i 个数是 xi ,其中xi 可以取 [li , ri] 中任意的一个值。

设 ,求 S 种类数。

输入

第一行一个数n,接下来有n行,每行两个整数li,ri

1<=n,li,ri<=100,数据保证li<=ri

输出

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

样例输入

5
1 2
2 3
3 4
4 5
5 6

样例输出

26

解析:用bitset优化,dp,每输入一个范围,就是在前面已经计算的基础上加上这次范围内的数,每一次都加上l 到 r的范围的值,用|代替加法,<<i*i把答案加入到数组中。状态转移方程是a[i]|=a[i-1]<<(i*i);

 1 #include "bits/stdc++.h"
 2 #define ll long long
 3 using namespace std;
 4 inline void read(int &x)
 5 {
 6     x=0;char c=getchar();
 7     while(c<'0' || c>'9')c=getchar();
 8     while(c>='0' && c<='9'){
 9         x=x*10+c-'0';
10         c=getchar();
11     }
12 }
13 inline void write(int x)
14 {
15     int y=10,len=1;
16     while(y<=x) {y*=10;len++;}
17     while(len--){y/=10;putchar(x/y+48);x%=y;}
18 }
19 bitset<1000010>a,b;
20 int main()
21 {
22     int n,l,r;
23     read(n);
24     b[0]=1;
25     while(n--)
26     {
27         read(l);read(r);
28         a.reset();
29         //b.reset();
30         //b[0]=1;
31         for(int i=l;i<=r;++i)
32         {
33             a|=b<<(i*i);
34         }
35         b=a;
36     }
37     printf("%d\n",b.count());
38 }
View Code

猜你喜欢

转载自www.cnblogs.com/htmrc1/p/10051506.html
今日推荐