解題報告:簡單瞎搞題(bitset的應用)

題目鏈接:https://ac.nowcoder.com/acm/contest/5556/E

在這裏插入圖片描述

輸入

5
1 2
2 3
3 4
4 5
5 6

輸出

26

備註:
1n,li,ri1001 ≤ n , l_i , r_i ≤ 100

先點我瞭解bitset

先試一個樣例

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.
全部加上11=11*1=1,就是a|=b<<1
a的第二位變爲1,a=010000,即第2位 - > 1當前的和有1
然後是22=42*2=4
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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章