1. 程式人生 > >集訓隊日常訓練20181201 C 1003 : 種類數

集訓隊日常訓練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