AT2346 [ARC070B] No Need

https://www.luogu.com.cn/problem/AT2346

发现 > = K >=K >=K的是没用的
就是去掉一个数的背包
按照套路分治做即可,可以用bitset优化成 O ( n k l o g n w ) O(\frac{nklogn}{w}) O(wnklogn)
代码实现不难

code:


#include<bits/stdc++.h>
#define N 5050
using namespace std;
int n, m, a[N], ans;
bitset<N> f;
void add(int x) {
    if(x >= m) return;
    f |= f << x;
}
void solve(int l, int r) {
    if(l == r) {
        if(a[l] >= m) return ;
        for(int i = m - a[l]; i < m; i ++) if(f[i]) {
            ans --;
            return ;
        }
        return ;
    }
    bitset<N> g = f;
    int mid = (l + r) >> 1;
    for(int i = mid + 1; i <= r; i ++) add(a[i]);
    solve(l, mid); f = g;
    for(int i = l; i <= mid; i ++) add(a[i]);
    solve(mid + 1, r);
}
int main() {
    scanf("%d%d", &n, &m); f[0] = 1;
    ans = n;
    for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), ans -= a[i] >= m;
    solve(1, n);
    printf("%d", ans);
    return 0;
}
posted @ 2021-10-13 15:05  lahlah  阅读(44)  评论(0编辑  收藏  举报