BZOJ4828 AHOI/HNOI2017大佬(动态规划+bfs)
注意到怼大佬的操作至多只能进行两次。我们逐步简化问题。
首先令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)的更多相关文章
- [bzoj4828][Ah/Hnoi2017]大佬
来自FallDream的博客,未经允许,请勿转载,谢谢. 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你 ...
- [AH2017/HNOI2017]大佬(动态规划 搜索)
/* 神仙yyb 理解题意可以发现 能够对大佬造成的伤害只和你怼了多少天大佬有关, 而且显然天数越多越好 那么我们可以先通过预处理来找出我们最多能够怼多少天大佬 然后我们发现最后我们能怼的血量状态数是 ...
- [HNOI2017] 大佬 - DP,BFS,Hash,单调性
这真的是一道综合题.然而感觉A得莫名其妙,交上去的时候其实非常虚,然后就莫名其妙地AC了? 首先我们考虑到,所有和怼有关的操作都是时刻无关的.也就是说,我们把这些操作拆散放到任何时候都对结果不会有影响 ...
- loj #2021. 「AHOI / HNOI2017」大佬
#2021. 「AHOI / HNOI2017」大佬 题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢 ...
- loj#2020 「AHOI / HNOI2017」礼物 ntt
loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...
- 「AHOI / HNOI2017」单旋
「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...
- 「AHOI / HNOI2017」影魔
「AHOI / HNOI2017」影魔 题目描述 解决这类比较复杂的区间贡献问题关键在于找到计算的对象. 比如这道题,我们计算的对象就是区间中间的最大值. 对于点\(i\),我们找到左边第一个比他大的 ...
- loj #2023. 「AHOI / HNOI2017」抛硬币
#2023. 「AHOI / HNOI2017」抛硬币 题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个 ...
- [LOJ 2022]「AHOI / HNOI2017」队长快跑
[LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...
随机推荐
- 博客搬家了qwq
呃,其实也不是搬家了,应该算是逐渐过渡qwq \[\color{skyblue}{Orchid} \color{purple}{any}\] 好的,我在学校里并不可以用Hexo,因为deploy总是挂 ...
- 解密:Python风靡全宇宙,首要原因竟是它?
就让我们从近年来大数据的兴起说起,为你娓娓道来Python火爆的真正原因. 郁闷的大数据程序员 随着大数据的崛起,大多数行业发现自己进入了一种恐慌状态:他们花费了大量的时间和金钱来建立他们的大数据渠道 ...
- Windows下jupyter notebook 修改打开的浏览器
1. 打开cmd,输入jupyter notebook --generate-config 2. 根据返回的路径打开 C:\Users\Administrator\.jupyter\jupyter_n ...
- python第二周
第二周,PYTHON图形绘制 一,计算机技术的演进发展 1946-1981.从第一台计算机的诞生到IBM的PC机的出现,我们称之为”计算机系统结构时代“.————这个时代重点在解决计算能力问题 198 ...
- Socket入门笔记 用TcpClient实现一个简易聊天室
效果 实现思路 使用TcpListener建一个服务器,接收所有客户端发送的消息,然后由服务器再发送到其他客户端 客户端使用TcpClient,发消息给服务器,接收服务器的消息,不和其他客户端直接交互 ...
- ceph学习
网络: ceph必须要有公共网络和集群网络: public network:负责客户端交互以及osd与mon之间的通讯 cluster network:负责osd之间的复制,均衡,回填,数据恢复等操作 ...
- 普通程序员看k8s基于角色的访问控制(RBAC)
一.知识准备 ● 上一节描述了k8s的账户管理,本文描述基于角色的访问控制 ● 网上RBAC的文章非常多,具体概念大神们也解释得很详细,本文没有站在高屋建瓴的角度去描述RBAC,而是站在一个普通程序员 ...
- inode 软/硬链接
一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统 ...
- 分布式监控系统Zabbix3.4-钉钉告警配置记录
群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步.例如:通过聚合GitHub,GitLab等源码管理服务,实现源码更新同步:通过聚合Trello,JIR ...
- Node 系列之url模块
引入 url: const url = require("url"); 用于URL解析.处理等操作的解决方案 1.url.parse(urlStr[, parseQueryStri ...