1 条题解
-
0
对一次询问 ,求出在 的物品中选出一些物品满足 时 最大值 ,若 则答案为
TAK,否则为NIE。把物品按 从小到大排序,询问按 从小到大排序,这样 的物品集是只加不减的。
设 表示在目前考虑的物品中选出一些物品满足 时 最大值,
考虑加入物品 的贡献,有转移 。
则处理一次询问 时,先加入所有 的物品,然后若 则答案为
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; }
- 1
信息
- ID
- 4459
- 时间
- 6500ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者