题目:
一共有 n个数,第 i 个数是 xi
xi 可以取 [li , ri] 中任意的一个值。
设 ,求 S 种类数。
1 ≤ n , li , ri ≤ 100
做法:
建个1e6的bitset。从1到n枚举每个数的取值。用bitset左移k位表示前面能表示的所有数+k。就这样直接暴力就行了。
代码:
#include <bits/stdc++.h> #define IOS ios::sync_with_stdio(false), cin.tie(0) #define debug(a) cout << #a ": " << a << endl using namespace std; typedef long long ll; const int N = 1e6 + 7; bitset<N> ans, tmp, zero; int main(void){ IOS; int n; cin >> n; ans[0] = 1; for (int i = 1; i <= n; ++i){ int l, r; cin >> l >> r; tmp = ans; ans = zero; for (int j = l; j <= r; ++j){ ans |= (tmp << (j*j)); } } int cnt = 0; for (int i = 0; i < N; ++i){ if (ans[i] == 1) cnt++; } cout << cnt << endl; return 0; }