感受
苦苦针扎,一直想不到题目有什么暗示优化的地方。
做着做着把题目当成图片说明 来做,然后用树状数组优化,好不容易搞出了一个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 表达。
*/