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

传送门

题意:

  • 要变强,不空喊,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;
}

 

上一篇:CSUST 简单数学题 题解(质因子分解+并查集)


下一篇:2021-04-01