其他分享
首页 > 其他分享> > 要变强,不空喊,ak题目,继续向前。(背包DP优化+bitset应用)

要变强,不空喊,ak题目,继续向前。(背包DP优化+bitset应用)

作者:互联网

传送门

题意:

题解:分组背包复杂度O(1e10),bitset优化O(1e10/32)

bitset深入学习:C++ bitset 用法

代码:

/*
https://ac.nowcoder.com/acm/contest/16806/C:
要变强,不空喊,ak题目,继续向前。
1.数据范围较小,背包问题,复杂度1e2*log(1e2)*1e6
emmm写完才发现不是多重背包,而是分组背包,那么时间复杂度变成了1e2*1e2*1e6
2.试过优先队列,结果发现不是解决这个问题的。它解决的是,每组数去一个,mx-mi的最小值
3.直接搜索试试
4.bitset,这么好用emm
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 5;
const int M = 1e6 + 5;
int n, l, r;
bitset<M> ans, tmp;  //初始时都为0,每次操作时间复杂度O(n/32)
signed main() {
    cin >> n;
    int i, j;
    scanf("%d%d", &l, &r);
    for (i = l; i <= r; i++) ans[i * i] = 1;
    for (i = 2; i <= n; i++) {
        scanf("%d%d", &l, &r);
        tmp =
            0;  //初始化。不能为ans,因为它是每组取一个数,而不是所有组中取任意数
        // cout << i << ' ' << tmp << endl;
        for (j = l; j <= r; j++) tmp |= (ans << j * j);
        ans = tmp;
    }
    //时间复杂度O(1e2*1e2*1e6/32),大概3e8
    // cout << ans << endl;
    cout << ans.count();
    return 0;
}

 

标签:背包,空喊,int,复杂度,1e2,bitset,1e6,ak
来源: https://blog.csdn.net/I_have_a_world/article/details/117620729