NC11169E

小G的数学难题

https://ac.nowcoder.com/acm/contest/11169/E

比赛的时候写了个假算法,跑的贼快还AC了,现在看了下确实相当不妥,当时写的两个dp并不同步,运气好,数据刚好没有能卡的罢了,现在来补一下正解。

Solution

遇到问题毫无头绪的时候先从暴力的方法入手然后逐步优化。
首先能想到01背包的暴力解法。

表示前 个数满足:


  1. 对于 这一维,我们可以对 的数取 不影响答案,这样就得到了一个 的做法。

现在该思考的是如何优化,注意数据范围:
这里要用到单调队列优化DP。

表示前 个数满足:

单调队列维护一个队列满足 :

  1. 单调递增的同时 单调递增

的条件下求

对于空间上的优化,我们发现只会用到 的状态和 的状态,这里可以用滚动数组处理。

Code

#include <bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define lowbit(x) ((x) & -(x))

using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;

constexpr double eps = 1e-8;
constexpr int NINF = 0xc0c0c0c0;
constexpr int INF = 0x3f3f3f3f;
constexpr ll mod = 1e9 + 7;
constexpr ll N = 1e6 + 5;

int n, P, a[N], b[N], c[N], q[N], head, tail;

void solve() {
    cin >> n >> P;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) cin >> b[i];
    for (int i = 1; i <= n; i++) cin >> c[i];
    const int mx = 2000000005;
    vector<int> f(P + 1, mx);
    f[0] = 0;
    for (int i = 1; i <= n; i++) {
        vector<int> g(P + 1, mx);
        head = 1, tail =0;
        for (int j = a[i]; j <= P; j++) {
            if (head <= tail && q[head] + b[i] < j) ++head;
            while (head <= tail && f[q[tail]] >= f[j - a[i]]) --tail;
            q[++tail] = j - a[i];
            if (f[q[head]] != mx) g[j] = f[q[head]] + c[i];
        }
        for (int j = a[i]; j <= P; j++) f[j] = min(f[j], g[j]);
    }
    if (f[P] == mx) {
        cout << "IMPOSSIBLE!!!\n";
    } else {
        cout << f[P] << '\n';
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        solve();
    }

    return 0;
}
11eyes的排位日记 文章被收录于专栏

codeforces近期的比赛2200以下的题目为主的一些各大OJ平台的题

全部评论

相关推荐

04-11 23:51
门头沟学院 Java
坚定的芭乐反对画饼_许愿Offer版:人人都能过要面试干嘛,发个美团问卷填一下,明天来上班不就好了
点赞 评论 收藏
分享
繁华的街道两旁,湿漉漉的下午,两个青涩的脸庞互相张望。宽大卫衣下娇小的她,向我奔来。不约而同的卫衣,斯文的半框眼镜掩饰着一个穷臭屌丝气息。这是我和我牛爱网第一死忠粉兼专属女嘉宾最初的见面。火速恋爱,但是没有所谓的快节奏,相识半年,还是一样的热恋。吃着肉夹馍坐过西安的小三轮洱海边自行车的气球胖吃着她最喜欢的酸酸水果和小乳扇在南山某店爷爷穿孙子衣服,摸肥猫就算我在忙也要抽出时间陪她去吃他喜欢的漂亮饭生活总是平凡,但平凡不平淡还记得见面第一件事儿:“我去上个厕所。”现在早上第一件事儿:“拉*”第一次上我车的她:“我可以坐副驾吗?”现在的她:“老子把jio翘到上面得得挡到你后视镜。”这小孩,虽然花了我...
Stan_蹒跚者:确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务