P3537 [POI2012] SZA-Cloakroom 题解

对一次询问 m,k,s,求出在 aim 的物品中选出一些物品满足 ci=kminbi 最大值 f,若 f>m+s 则答案为 TAK,否则为 NIE

把物品按 a 从小到大排序,询问按 m 从小到大排序,这样 aim 的物品集是只加不减的。

fk 表示在目前考虑的物品中选出一些物品满足 ci=kminbi 最大值,

考虑加入物品 i 的贡献,有转移 fkmax{fk,min{fkci,bi}}

则处理一次询问 m,k,s 时,先加入所有 aim 的物品,然后若 fk>m+s 则答案为 TAK,否则为 NIE

#include <cstdio>
#include <algorithm>
using namespace std;
struct S
{
    int a, b, c;
} a[1050];
struct Q
{
    int m, k, s, i;
} q[1000050];
int n, m, f[100050];
bool b[1000050];
bool C1(S x, S y) { return x.a < y.a; }
bool C2(Q x, Q y) { return x.m < y.m; }
int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
        scanf("%d%d%d", &a[i].c, &a[i].a, &a[i].b);
    sort(a, a + n, C1);
    scanf("%d", &m);
    for (int i = 0; i < m; ++i)
        scanf("%d%d%d", &q[i].m, &q[i].k, &q[i].s), q[i].i = i;
    sort(q, q + m, C2);
    f[0] = 1e9;
    for (int i = 0, j = 0; i < m; ++i)
    {
        for (; j < n && a[j].a <= q[i].m; ++j)
            for (int l = 1e5; l >= a[j].c; --l)
                f[l] = max(f[l], min(f[l - a[j].c], a[j].b));
        b[q[i].i] = f[q[i].k] > q[i].m + q[i].s;
    }
    for (int i = 0; i < m; ++i)
        puts(b[i] ? "TAK" : "NIE");
    return 0;
}
posted @   Jijidawang  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示