专栏文章

题解:P10334 [UESTCPC 2024] 饮料

P10334题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@miqyt00g
此快照首次捕获于
2025/12/04 12:57
3 个月前
此快照最后确认于
2025/12/04 12:57
3 个月前
查看原文

无解

容易发现前 tt 分钟最多做 tt 瓶饮料,所以当 第 ii 个人需要在小于 ii 的时间取走饮料时,无解。
即存在 ti<it_i<i 时无解,其余情况均有解。

求解

注意到第 ii 个人会取走当前最大的饮料,所以我们可以反向枚举 ii 进行求解,先分配大于 tit_i 的时间里制作的饮料大小,并将当前的饮料与栈顶饮料的最大值入栈作为当前会拿走的饮料大小。
正确性显然,时间复杂度 O(n)\mathcal{O}(n) 轻松切过本题。

CODE

CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, t[N], a[N], stk[N], tp;
long long ans;
int main() {
    scanf("%d", &n);
    bool as = 0;
    for(int i = 1; i <= n; ++i) {
        scanf("%d", t + i);
        if(t[i] < i) as = 1;
    }
    for(int i = 1; i <= n; ++i) scanf("%d", a + i);
    if(as) puts("-1");
    else {
        int now = t[n];
        for(int i = n; i; --i) {
            while(tp && now > t[i]) --now, ans += stk[tp--];
            stk[tp] = max(stk[tp++], a[i]);
            now = t[i];
        }
        while(tp) ans += stk[tp--];
        printf("%lld", ans);
    }
    return 0;
}

评论

2 条评论,欢迎与作者交流。

正在加载评论...