注意到怼大佬的操作至多只能进行两次。我们逐步简化问题。

  首先令f[i][j]表示第i天结束后自信值为j时至多有多少天可以进行非防御操作(即恢复自信值之外的操作)。这个dp非常显然。由于最终只需要保证存活,那么取f中的最大值即可(可以在第n天之前使大佬自信值为0而结束),之后就不用再管自己的自信值。复杂度是O(n·mc),数据范围远远没有开满,可能是怕提示做法吧。

  现在知道了有多少天可以用来攻击(当然可以有些天划水)。对于攻击操作,哪一天进行是没有区别的。那么先不考虑还嘴操作。

  只剩下怼大佬的操作了。先看一次。虽然值域很大,操作方案数也是指数级别,但发现总共能打出来的在值域范围内的伤害种类数在可以接受的范围内。具体有多少我也不知道,总之我们可以暴搜剪剪枝map判个重(伤害和等级都相等),把所有可行伤害算出来。

  于是知道了用x天怼大佬可以造成的所有可行伤害。最多可以怼两次,那么给两次怼操作分配天数,当然还有还嘴操作。

  假设总共n天,给两次怼操作分配的天数分别为d1,d2,造成的伤害分别为w1,w2。如果能怼死大佬,则其满足w1+w2<=q<=w1+w2+n-(d1+d2)。这样不用考虑n的总天数限制。如果枚举d1和w1,由前一个式子,随着w1减小,满足条件的最大的w2会增大。而由后一个式子,显然应让w2-d2尽量大。于是我们按照w排序,从大到小枚举w1,并记录w2-d2的最大值就可以了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 110
#define inf 100000001
int n,m,Q,a[N],w[N],f[N][N],head,tail;
map<long long,bool> g;
struct data
{
int d,l,w;
bool operator <(const data&a) const
{
return w<a.w;
}
}q[];
long long calc(int x,int y){return 1ll*(n+)*x+y;}
void bfs()
{
q[tail=]=(data){,,};g[calc(,)]=;
do
{
head++;if (q[head].d==n) break;
if (q[head].l>&&1ll*q[head].w*q[head].l<inf&&!g[calc(q[head].w*q[head].l,q[head].l)]) g[calc(q[head].w*q[head].l,q[head].l)]=,q[++tail]=(data){q[head].d+,q[head].l,q[head].w*q[head].l};
if (1ll*q[head].w*(q[head].l+)<inf&&!g[calc(q[head].w,q[head].l+)]) g[calc(q[head].w,q[head].l+)]=,q[++tail]=(data){q[head].d+,q[head].l+,q[head].w};
}while (head<tail);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4828.in","r",stdin);
freopen("bzoj4828.out","w",stdout);
const char LL[]="%I64d";
#else
const char LL[]="%lld";
#endif
n=read(),Q=read(),m=read();
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<=n;i++) w[i]=read();
memset(f,,sizeof(f));
f[][m]=;
for (int i=;i<n;i++)
for (int j=a[i+];j<=m;j++)
{
f[i+][min(m,j-a[i+]+w[i+])]=max(f[i+][min(m,j-a[i+]+w[i+])],f[i][j]);
f[i+][j-a[i+]]=max(f[i+][j-a[i+]],f[i][j]+);
}
int v=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
v=max(v,f[i][j]);
n=v;
bfs();
sort(q+,q+tail+);
q[].d=q[].l=q[].w=;
while (Q--)
{
int x=read(),mx=-inf,p=-;
int flag=;
for (int j=tail;j>=;j--)
{
while (p<tail&&q[p+].w+q[j].w<=x)
p++,mx=max(mx,q[p].w-q[p].d);
if (q[j].w-q[j].d+mx+n>=x) {flag=;break;}
}
cout<<flag<<endl;
}
return ;
}

BZOJ4828 AHOI/HNOI2017大佬(动态规划+bfs)的更多相关文章

  1. [bzoj4828][Ah/Hnoi2017]大佬

    来自FallDream的博客,未经允许,请勿转载,谢谢. 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你 ...

  2. [AH2017/HNOI2017]大佬(动态规划 搜索)

    /* 神仙yyb 理解题意可以发现 能够对大佬造成的伤害只和你怼了多少天大佬有关, 而且显然天数越多越好 那么我们可以先通过预处理来找出我们最多能够怼多少天大佬 然后我们发现最后我们能怼的血量状态数是 ...

  3. [HNOI2017] 大佬 - DP,BFS,Hash,单调性

    这真的是一道综合题.然而感觉A得莫名其妙,交上去的时候其实非常虚,然后就莫名其妙地AC了? 首先我们考虑到,所有和怼有关的操作都是时刻无关的.也就是说,我们把这些操作拆散放到任何时候都对结果不会有影响 ...

  4. loj #2021. 「AHOI / HNOI2017」大佬

    #2021. 「AHOI / HNOI2017」大佬   题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢 ...

  5. loj#2020 「AHOI / HNOI2017」礼物 ntt

    loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...

  6. 「AHOI / HNOI2017」单旋

    「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...

  7. 「AHOI / HNOI2017」影魔

    「AHOI / HNOI2017」影魔 题目描述 解决这类比较复杂的区间贡献问题关键在于找到计算的对象. 比如这道题,我们计算的对象就是区间中间的最大值. 对于点\(i\),我们找到左边第一个比他大的 ...

  8. loj #2023. 「AHOI / HNOI2017」抛硬币

    #2023. 「AHOI / HNOI2017」抛硬币   题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个 ...

  9. [LOJ 2022]「AHOI / HNOI2017」队长快跑

    [LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...

随机推荐

  1. three.js - 渲染并展示三维对象

    看结果: 看源码及解释: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. Python/Jupyter Notebook以及可视化的运用

    最近陆陆续续使用Jupyter Notebook和Python可视化做了一些小工具,用于提高开发效率. 这里将其归类总结一下,作为学习的记录.

  3. maven 基础

    maven安装链接 maven基础命令: 编译命令:mvn compile 测试命令:mvn test 清空命令:mvn clean 打包命令:mvn package 打包命令:mvn install ...

  4. Kubernetes-v1.12.0基于kubeadm部署

    1.主机规划 #master节点(etcd/apiserver/scheduler/controller manager)master.example.cometh0: 192.168.0.135et ...

  5. CF1101G (Zero XOR Subset)-less 线性基

    传送门 既然每一次选择出来的都是一个子段,不难想到前缀和计算(然而我没有想到--) 设异或前缀和为\(x_i\),假设我们选出来的子段为\([1,i_1],(i_1,i_2],...,(i_{k-1} ...

  6. [Spark][Python]RDD flatMap 操作例子

    RDD flatMap 操作例子: flatMap,对原RDD的每个元素(行)执行函数操作,然后把每行都“拍扁” [training@localhost ~]$ hdfs dfs -put cats. ...

  7. 使用Hexo+Github搭建属于自己的博客(进阶)

    主题的配置:这里以NexT主题作为题材 1.安装NexT,在其文件夹中鼠标右键,点击Git Base Here.输入命令:git clone https://github.com/iissnan/he ...

  8. Git push 时如何避免出现 "Merge branch 'master' of ..."

    在使用 Git 的进行代码版本控制的时候,往往会发现在 log 中出现 "Merge branch 'master' of ..." 这句话,如下图所示.日志中记录的一般为开发过程 ...

  9. Unity 敌人波次设计

    一.平均时间随机敌人 将所有种类敌人预制物体放在一个列表里面,每隔时间T从列表中随机选出一个生成在场景中. 二.时间加权紧迫度随机敌人 在随机情况下每种敌人出现的概率近似相等,当敌人种类较多时,有可能 ...

  10. ireportdesigner下载页面

    iReport主页:http://community.jaspersoft.com/project/ireport-designer iReport下载地址:http://sourceforge.ne ...