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. django template 模板

    九.Template模板 Template 模板是根据view传过来数据在html展示的功能,典型python 模板jinjia2库提供丰富的上下文展示func 创建template位置在项目下与ap ...

  2. C/C++编程规范

    1.文件结构 C/C++程序通常分为两个文件,一个文件用于保存程序的声明,一个文件用于保存程序的实现. 1.1 版权和版本的声明 版权和版本的声明位于头文件和定义文件的开头,主要内容有:(1)版权信息 ...

  3. Python学习(五)—— 集合和字符格式化

    数据类型和变量的总结 字符串 数字 列表 元组 字典 分类 1.可变不可变: 可变(即修改变量值以后id不改变):列表.字典 不可变(即修改变量值以后id改变):字符串.数字.元组 2.访问顺序: 直 ...

  4. PHP加JS实现分片上传,断点续传

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title> ...

  5. 我来给你讲清楚Pythony广播

    初学python广播搞的人头大,今天老师上课讲了一下,茅塞顿开,zt老师nb 首先说一下后向纬度(这个后向纬度书里边称作低维),举例:(3,4,5)后向纬度是:3*4*5或4*5或5 向量广播的条件有 ...

  6. 如何在应用程序中使用ML.NET?

    https://www.cnblogs.com/shanyou/p/9190701.html ML.NET以NuGet包的形式提供,可以轻松安装到新的或现有的.NET应用程序中. 该框架采用了用于其他 ...

  7. 抽取JDBC工具类

    package com.wbytts.util; import java.io.IOException; import java.io.InputStream; import java.sql.Con ...

  8. CSS样式的优先级(权重)

    当使用不同的选择器选中同一个元素并设置相同样式时,这时样式间产生了冲突 最终采用的是哪个选择器? 由选择器的优先级(权重)决定,权重高的优先显示 优先级规则(多个按位置分别进行计算,不进位): 内联样 ...

  9. java 生成签名文件

    如何使用jdk中的keytool.exe生成一个签名文件? 1.通过命令行cmd进入jdk的bin目录下,会发现有一个keytool.exe文件 执行命令:keytool -genkey -alias ...

  10. JS线程及回调函数执行

    JS是单线程的程序,在某些方面来讲并不是十分准确.在浏览器的内核里面有很多的模块,比如js的解释执行的模块,html.css的处理模块,渲染模块等,多数模块是单线程执行的,但是有几个模块是多线程的,比 ...