感受
苦苦针扎,一直想不到题目有什么暗示优化的地方。
做着做着把题目当成 来做,然后用树状数组优化,好不容易搞出了一个3e8的复杂度,准备测试样例时,卧槽,这求的和我做的不一样。
索性放弃了,看完题解,感叹bitset优化这么牛吗?整体移动可以达到,n是Bitset容器大小
知道bitset的优秀复杂度,就可以直接愉快地状态转移了。
bitset<100> bit; bit << 5 相当于原来状态的值 + 5
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e6 + 10; bitset<maxn> ans(1), tmp; int n; int main(){ scanf("%d", &n); int l, r; for(int i = 1; i <= n; i++){ scanf("%d%d", &l, &r); tmp.reset(); for(int j = l; j <= r; j++){ tmp |= (ans << (j * j)); } ans = tmp; } cout << ans.count() << endl; return 0; } /* bitset<10> bs1; cout << bs1 << endl;///每一位都是 false bitset<10> bs2(5); cout << bs2 << endl;/// 设为 val 的二进制形式。 bitset<10> bs3("101"); cout << bs3 << endl;///设为 串 str cout << (bs2 == bs1) << endl; cout << (bs2 != bs1) << endl;/// 比较两个 bitset 内容是否完全一样 cout << bs2[3] << endl;///访问其特定的一位。 ///&/&=/|/| =/^/^=/~ 操作符只能针对bitset之间 ///count() : 返回 true 的数量。 ///size() : 返回 bitset 的大小。 ///test(pos) : 它和 vector 中的 at() 的作用是一样的,和 [] 运算符的区别就是越界检查。 ///any() : 若存在某一位是 true 则返回 true ,否则返回 false 。 ///none() : 若所有位都是 false 则返回 true ,否则返回 false 。 ///all() : C++11 ,若所有位都是 true 则返回 true ,否则返回 false 。 ///set() : 将整个 bitset 设置成 true 。 ///set(pos, val = true) : 将某一位设置成 true / false 。 ///reset() : 将整个 bitset 设置成 false 。 ///reset(pos) : 将某一位设置成 false 。相当于 set(pos, false) 。 ///flip() : 翻转每一位。( 0 - 1 ,相当于异或一个全是 1的 bitset ) ///flip(pos) : 翻转某一位。 ///to_string() : 返回转换成的字符串表达。 ///to_ulong() : 返回转换成的 unsigned long 表达 ( long 在 NT 及 32 位 POSIX 系统下与 int 一样,在 64 位 POSIX 下与 long long 一样)。 ///to_ullong() : C++11 ,返回转换成的 unsigned long long 表达。 */