Description

题库链接

题意简述来自Gypsophila

你现在要怼 \(m\) 个大佬,第 \(i\) 个大佬的自信值是 \(C_i\) 。每次怼大佬之前,你的自信值是 \(mc\),等级 \(L=0\),嘲讽值 \(F = 1\)。对于每一个大佬,你都有 \(n\) 天时间来怼大佬。无论哪个大佬,他们都会在第 \(i\) 天使你的的自信值下降 \(a_i\) 如果你的自信值为负数,那么你失败了。在第 \(i\) 天,你可以干一下事情中的恰好一件:

  1. 使得大佬自信值下降 \(1\)
  2. 使得自己的自信值增加 \(w_i\)
  3. 把自己的等级 \(+1\)
  4. 把自己的 \(F\) 乘上 \(L\)
  5. 怼大佬,使得大佬的自信值下降 \(F\),之后\(L=0\) ,\(F=1\)(该操作最多使用 2 次)
  6. 如果中途大佬自信值为负数,你失败了。若大佬自信值恰好为 \(0\) ,则你成功了。

对于每个大佬求你能否成功。

\(1\leq n,mc\leq 100,1\leq m\leq 20,1\leq a_i,w_i\leq mc,1\leq C_i\leq 10^8\)

Solution

显然我们要做的就是在活下来的情况下,尽可能地把大佬砍到 0。首先我们需要知道最多能空出几天来砍大佬。

设 \(f_{i,j}\) 表示前 \(i\) 天空 \(j\) 天时自己的最大血量。初始 \(f_{0,0}=mc\)。可以 \(O(n^2)\) DP 算出答案,记为 \(maxd\)。

那么我们考虑如果在 \(maxd\) 天内砍大佬。

  1. 不用“怼大佬”。显然,若是 \(C_i\leq maxd\),可以直接把大佬砍死;
  2. 用一次“怼大佬”,我们记怼大佬用的时间(准备时间(累加 \(L\) 和累乘 \(F\) 的时间)+怼大佬的那天)为 \(d\),造成的伤害为 \(f\)。那么由于不能把大佬砍成负,要满足 \(f\leq C_i\),又要把大佬砍到 0,因此 \(f+maxd-d\geq C_i\);
  3. 用两次“怼大佬”,我们记怼大佬用的时间分别为为 \(d_1,d_2\),造成的伤害为 \(f_1,f_2\)。那么要满足 \(f_1+f_2\leq C_i\) 以及 \(f_1+f_2+maxd-d_1-d_2\geq C_i\)。

考虑如何找到所有的 \((d,f)\),做法是直接暴力搜索,注意搜索的时候判重以及一些最优性减枝。

对于上述第 3 个情况,我们不能去暴力枚举。但是实际上对于每个 \(f_1\) 我们要找的就是最大的 \(f_2\) 使得 \(f_1+f_2\leq C_i\)。这样我们将所有方案排序后用双指针扫就好了。

Code

#include <bits/stdc++.h>
#define pii pair<int, int>
using namespace std;
const int N = 105, C = 1e8; struct piii {
int d, l, f;
piii (int _d = 0, int _l = 0, int _f = 0) {
d = _d, l = _l, f = _f;
}
bool operator < (const piii &b) const {
if (d == b.d && f == b.f) return l < b.l;
if (f == b.f) return d > b.d;
return f < b.f;
}
bool operator == (const piii &b) const {
return d == b.d && l == b.l && f == b.f;
}
};
int n, m, mc, a[N], w[N], f[N][N], c;
int maxd, head, tail;
map<pii, bool> mp;
piii q[N*N*N<<2], t;
pii v; void bfs() {
t = piii(1, 0, 1);
q[head = tail = 1] = t;
mp[pii(0, 1)] = 1;
while (head <= tail) {
t = q[head++];
if (t.d >= maxd) continue;
if (mp[v = pii(t.l+1, t.f)] == 0) {
mp[v] = 1;
q[++tail] = piii(t.d+1, t.l+1, t.f);
}
if (t.l > 1 && 1ll*t.f*t.l <= C && mp[v = pii(t.l, t.f*t.l)] == 0) {
mp[v] = 1;
q[++tail] = piii(t.d+1, t.l, t.f*t.l);
}
}
}
int main() {
scanf("%d%d%dd", &n, &m, &mc);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n; i++) scanf("%d", &w[i]);
memset(f, -1, sizeof(f));
f[0][0] = mc;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= i; j++) {
if (f[i-1][j]-a[i] >= 0)
f[i][j] = max(min(f[i-1][j]-a[i]+w[i], mc), f[i][j]);
if (j && f[i-1][j-1]-a[i] >= 0)
f[i][j] = max(f[i-1][j-1]-a[i], f[i][j]);
}
for (int i = 1; i <= n; i++)
for (int j = 0; j <= i; j++)
if (f[i][j] >= 0) maxd = max(maxd, j);
bfs();
sort(q+1, q+tail+1);
for (int i = 1; i <= m; i++) {
scanf("%d", &c); int r;
if (c <= maxd) {
puts("1"); continue;
}
for (int i = 1; i <= tail; i++)
if (q[i].f <= c && q[i].f+maxd-q[i].d >= c) {
puts("1"); goto qwq;
}
r = tail;
for (int l = 1; l <= r; l++) {
while (l <= r && q[l].f+q[r].f > c) --r;
if (l <= r && q[l].f+q[r].f+maxd-q[l].d-q[r].d >= c) {
puts("1"); goto qwq;
}
}
puts("0");
qwq: 1;
}
return 0;
}

[HNOI 2017]大佬的更多相关文章

  1. 【HNOI 2017】大佬

    Problem Description 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语.你作为一个 OIer, ...

  2. [HNOI 2017]单旋

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...

  3. [HNOI 2017]抛硬币

    Description 题库链接 两人抛硬币一人 \(a\) 次,一人 \(b\) 次.记正面朝上多的为胜.问抛出 \(a\) 次的人胜出的方案数. \(1\le a,b\le 10^{15},b\l ...

  4. [HNOI 2017]影魔

    Description 题库链接 给你一段长度为 \(n\) 的序列 \(K\) . \(m\) 组询问,每次给定左右端点 \(l,r\) .求出满足区间内下述贡献和. 如果一个区间的两个端点是这一个 ...

  5. [HNOI 2017]礼物

    Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在 ...

  6. 【HNOI 2017】影魔

    Problem Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还 ...

  7. HNOI 2017

    题目链接 我还是按bzoj AC数量排序做的 4827 这个其实如果推一下(求每个值)式子会发现是个卷积,然后FFT就好了 4826 记不太清了,可以求出每个点左右第一个比他的的点的位置,将点对看成平 ...

  8. 【HNOI 2017】礼物

    Problem Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个装饰物,并且每个装饰物 ...

  9. AH/HNOI 2017 礼物

    题目链接 描述 两个序列 \(x, y\),可以将一个序列每个值同时加非负整数 \(c\),其中一个序列可以循环移位,要求最小化: \[\sum_{i = 1}^{n}(x_i - y_i) ^ 2 ...

随机推荐

  1. 红帽RHCE培训-课程3笔记内容1

    1 控制服务和守护进程 systemctl systemctl start ** systemctl restart ** systemctl enable ** systemctl status * ...

  2. stream.js

    <script src='stream-min.js'></script> 下载 stream.js 2Kb minified streams是什么? Streams 是一个操 ...

  3. 攻防世界 robots题

    来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...

  4. 在 Fabric 中使用私有数据

    本教程将演示收集器(collection)的使用,收集器为区块链网络上已授权的组织节点 提供私有数据的存储和检索. 本教程假设您已了解私有数据的存储和他们的用例.更多的信息请参阅 私有数据 . 本教程 ...

  5. Python学习(一)——开发语言和Python的安装

    开发语言: 高级语言: Python,Java,PHP,C#,Go,ruby,C++...都依赖于C→字节码 语言的对比: Python,Java:既能写网页又能写后台 Python:开发效率比Jav ...

  6. IS加载JSON 和 MP4文件 错误 404 提示 需要添加mime映射(默认IIS Express里没有映射)

    问题描述 在发布项目的时候,有一些文件是json文件,在网页中进行加载,但是在IIS7发布的时候,json文件居然是404,无法找到,在URL上输入地址也一样. 错误原因 IIS内部机制,不支持直接访 ...

  7. 【MySQL】单表查询

    " 目录 where 约束 group by 分组查询 聚合函数 having 过滤 order by 查询排序 limit 限制查询的记录数 # 语法 select 字段1, 字段2 .. ...

  8. ASP.NET Core中的依赖注入【上】

    此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 ASP.NET Core支持DI软件设计模式,其是一种为了 ...

  9. 「NOI2001」食物链

    传送门 Luogu 解题思路 带权并查集我不会啊 考虑种类并查集(扩展域并查集的一种). 开三倍空间,一倍维护本身,二倍维护猎物,三倍维护天敌,然后用并查集搞一搞就好了. 细节注意事项 咕咕咕 参考代 ...

  10. Vue如何用虚拟dom进行渲染view的

    前提 vue版本:v2.5.17-beta.0 触发render vue在数据更新后会自动触发view的render工作,其依赖于数据驱动:在数据驱动的工作下,每一个vue的data属性都被监听,并且 ...