題目鏈接:https://ac.nowcoder.com/acm/contest/5556/E
輸入
5
1 2
2 3
3 4
4 5
5 6
輸出
26
備註:
先試一個樣例
2
1 2
1 2
3
把其中的bitset輸出
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<bitset>
#include<limits.h>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
#define over(i,s,t) for(register int i=s;i<=t;++i)
#define lver(i,t,s) for(register int i=t;i>=s;--i)
//#define int __int128
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
const int N=1e6+7;
const int mod=1e9+7;
const ll INF=1e15+7;
const double EPS=1e-10;//趨近爲0
int n;
int l,r;
bitset<10>a,b;
int main()
{
cin>>n;
b[0]=1;
over(i,1,n){
scanf("%d%d",&l,&r);
cout<<"b:"<<" ";
for (int i=0;i<10;++i) {
cout<<b[i];
}
puts("");
over(j,l,r){
a|=b<<(j*j);
cout<<"a:"<<" ";
for (int i=0;i<10;++i) {
cout<<a[i];
}
puts("");
}
b=a;
a.reset();
}
cout<<"b:"<<" ";
for (int i=0;i<10;++i) {
cout<<b[i];
}
puts("");
printf("%d\n",b.count());
return 0;
}
注意這裏是從高位到低位倒序輸出
解釋一下這裏的樣例。
首先初始化必須b[0]=1
即第1位 - > 0,當前的和爲0
第一次輸入1,2.
全部加上,就是a|=b<<1
。
a的第二位變爲1,a=010000,即第2位 - > 1當前的和有1
然後是
b<<4=10000,a|b=000010010
。代表着有2和4兩種情況。
然後是1,全體左移1,就是全體的數加上1。
然後2,全體左移4,即是全體數加4。
因爲是|
,按位或運算,所以不會出現重複計算的情況,直接用b.count()
得到有多少個1既是有多少種情況。
AC代碼:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<bitset>
#include<limits.h>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
#define over(i,s,t) for(register int i=s;i<=t;++i)
#define lver(i,t,s) for(register int i=t;i>=s;--i)
//#define int __int128
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
const int N=1e6+7;
const int mod=1e9+7;
const ll INF=1e15+7;
const double EPS=1e-10;//趨近爲0
int n;
int l,r;
bitset<N>a,b;
int main()
{
cin>>n;
b[0]=1;
over(i,1,n){
scanf("%d%d",&l,&r);
over(j,l,r){
a|=b<<(j*j);
}
b=a;
a.reset();
}
printf("%d\n",b.count());
return 0;
}