HNOI2017大佬
- 贼难的一道题
- 虽然算法都不难,但组合起来就是想不到
- 首先,最简单的一步,对所有大佬,嘲讽你减的自信值和你做水题回复自信值都是不变的,写个\(dp\),设\(dp[i][j]\)表示第\(i\)天自信值为\(j\)可以有多少天不刷题,这便是你最多可以用的天数
- 现在你的任务便是在这么多天怼死大佬
- 考虑到与大佬对怼最多两次,剩下的天数就还嘴,\(bfs\)暴力搜索出所有你可以造成的伤害和所花的时间,自己写\(Hash\)判重,去重后的方案不会很多
- 现在处理每个大佬看能不能恰好怼死他
- 把所有搜索出的方案按伤害从大到小排序
- 首先如果天数比生命还多就直接可以
- 枚举使用一次技能可不可以
- 枚举使用两次技能可不可以,用个单调栈降低一下复杂度。
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
typedef int sign;
typedef long long ll;
#define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)
#define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)
const int N=100+5;
bool cmax(sign &a,sign b){return (a<b)?a=b,1:0;}
bool cmin(sign &a,sign b){return (a>b)?a=b,1:0;}
template<typename T>inline T read()
{
T f=1,ans=0;
char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch-'0'),ch=getchar();
return ans*f;
}
template<typename T>inline void write(T x,char y)
{
if(x==0)
{
putchar('0');putchar(y);
return;
}
if(x<0)
{
putchar('-');
x=-x;
}
static char wr[20];
int top=0;
for(;x;x/=10)wr[++top]=x%10+'0';
while(top)putchar(wr[top--]);
putchar(y);
}
void file()
{
#ifndef ONLINE_JUDGE
freopen("3724.in","r",stdin);
freopen("3724.out","w",stdout);
#endif
}
int n,m,mc;
int a[N],w[N];
int dp[N][N];
void input()
{
n=read<int>();m=read<int>();mc=read<int>();
For(i,1,n)a[i]=read<int>();
For(i,1,n)w[i]=read<int>();
}
int max_d;
const int inf=0x3f3f3f3f;
void init()
{
memset(dp,-inf,sizeof dp);
dp[0][mc]=0;
For(i,1,n)For(j,a[i],mc)
{
cmax(dp[i][j-a[i]],dp[i-1][j]+1);
cmax(dp[i][min(mc,j-a[i]+w[i])],dp[i-1][j]);
}
For(i,1,n)For(j,0,mc)cmax(max_d,dp[i][j]);
//write(max_d,'\n');
}
const int maxn=2e6+5;
namespace Hash
{
const int p=163,mo=72739;
struct node{int f,l,nex;}e[maxn];
int head[mo+5],tt;
int temp;
void add(int x,int y)
{
temp=(1ll*x*p%mo+y+mo)%mo;
e[++tt]=(node){x,y,head[temp]};
head[temp]=tt;
}
int find(int x,int y)
{
temp=(1ll*x*p%mo+y+mo)%mo;
for(int i=head[temp];i;i=e[i].nex)
if(e[i].f==x&&e[i].l==y)return 1;
return 0;
}
}
struct mess
{
int d,F,L;
};
int top;
queue<mess>l;
int c[N],max_c;
struct con
{
int f,d;
bool operator < (const con &s)const {return f<s.f;}
}q[maxn];
void bfs()
{
mess u,v;
l.push((mess){1,1,0});
while(!l.empty())
{
u=l.front();l.pop();
if(u.d==max_d)continue;
l.push((mess){u.d+1,u.F,u.L+1});
if(u.L>1&&(1ll*u.F*u.L)<=max_c&&!Hash::find(u.F*u.L,u.L))
{
v=(mess){u.d+1,u.F*u.L,u.L};
l.push(v);
q[++top]=(con){v.F,v.d};
Hash::add(v.F,v.L);
}
}
}
void work()
{
int flag,k,Min;
For(i,1,m)c[i]=read<int>(),cmax(max_c,c[i]);
bfs();
sort(q+1,q+top+1);
For(i,1,m)
{
flag=0;
if(c[i]<=max_d){puts("1");continue;}
k=1;Min=inf;
Fordown(j,top,1)
{
if(c[i]>=q[j].f&&c[i]-q[j].f<=max_d-q[j].d){flag=1;break;}
while(k<=top&&q[k].f+q[j].f<=c[i])
{
cmin(Min,q[k].d-q[k].f);
k++;
}
if(max_d>=c[i]-q[j].f+q[j].d+Min){flag=1;break;}
}
write(flag,'\n');
}
}
int main()
{
file();
input();
init();
work();
return 0;
}
HNOI2017大佬的更多相关文章
- bzoj4828 [Hnoi2017]大佬
Description 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语.你作为一个OIER,面对这样的事情非常 ...
- [AH/HNOI2017]大佬
题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...
- [bzoj4828][Ah/Hnoi2017]大佬
来自FallDream的博客,未经允许,请勿转载,谢谢. 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你 ...
- [AH2017/HNOI2017]大佬
题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...
- [AHOI2017/HNOI2017]大佬
Description: 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事 ...
- BZOJ4828 AHOI/HNOI2017大佬(动态规划+bfs)
注意到怼大佬的操作至多只能进行两次.我们逐步简化问题. 首先令f[i][j]表示第i天结束后自信值为j时至多有多少天可以进行非防御操作(即恢复自信值之外的操作).这个dp非常显然.由于最终只需要保证存 ...
- [AH2017/HNOI2017]大佬(动态规划 搜索)
/* 神仙yyb 理解题意可以发现 能够对大佬造成的伤害只和你怼了多少天大佬有关, 而且显然天数越多越好 那么我们可以先通过预处理来找出我们最多能够怼多少天大佬 然后我们发现最后我们能怼的血量状态数是 ...
- [HNOI2017]大佬
参考题解 \(\text{Solution}\) 我们发现5个行为中2操作与其它操作无关,所以我们采用贪心,尽量让多的时间去攻击大佬. 设 \(f[i][j]\) 表示前 \(i\) 天剩 \(j\) ...
- 【题解】HNOI2017大佬
哎……做了几个小时最后还是没能想到怼大佬的合法性到底怎么搞.写暴力爆搜感觉复杂度爆炸就没敢写 bfs / dfs 一类,后来发现在种种的约束条件下(远小于所给的 \(n, m\))复杂度完全是可以承受 ...
随机推荐
- CF888G Xor-MST 生成树、分治、Trie树合并
传送门 第一次接触到Boruvka求最小生成树 它的原版本是:初始每一个点构成一个连通块,每一次找到每一个连通块到其他的连通块权值最短的边,然后合并这两个连通块.因为每一次连通块个数至少减半,所以复杂 ...
- CSS3选择器之:nth-child(n)
第一次用到这个选择器还是为了解决下面了的问题: 手机的前端,我们使用了mint-ui,里面有一个日期选择控件,但是选择的时候没有提供年月的选择器,如: 而是提供了下面的方式: 为了达到上面的效果,使用 ...
- python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)
如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...
- 运行supervisord -c /etc/supervisor/supervisord.conf 出错,解决办法
坑都让我踩了...... 1 supervisord -c /etc/supervisor/supervisord.conf 什么意思? 答:手动启动:supervisord 具体详见 ...
- CentOS上yum方式安装配置LNMP
实验环境 一台最小化安装的CentOS 7.3虚拟机 安装软件包 yum install -y epel-* yum install -y nginx mariadb-server php php-m ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(八)线上Mysql数据库崩溃事故的原因和处理
前文提要 承接前文<一次线上Mysql数据库崩溃事故的记录>,在文章中讲到了一次线上数据库崩溃的事件记录,建议两篇文章结合在一起看,不至于摸不着头脑. 由于时间原因,其中只讲了当时的一些经 ...
- 从0到1上线一个微信小程序
0.0 前期准备 微信小程序的出现极大地降低了个人开发者微创业的门槛,不需要后端技术,不需要服务器和域名这些乱七八糟的前置操作,只需要懂得前端技术,就能发布一款属于自己的轻量级应用,简直是前端开发者的 ...
- [UWP 自定义控件]了解模板化控件(5.2):UserControl vs. TemplatedControl
1. UserControl vs. TemplatedControl 在UWP中自定义控件常常会遇到这个问题:使用UserControl还是TemplatedControl来自定义控件. 1.1 使 ...
- ansible一键部署k8s单机环境
一.虚拟机准备 干净的Centsot7.4.4G内存.2个CPU 最小化安装,最好带虚拟化 二.执行初始化脚本 注意:脚本中配置静态网卡根据实际网卡名称配置,我用的是ens33 可以用 sed -i ...
- Linux内核分析——进程的描述和进程的创建
进程的描述和进程的创建 一. 进程的描述 (一)进程控制块PCB——task_struct 1.操作系统的三大管理功能包括: (1)进程管理 (2)内存管理 (3)文件系统 2.PCB task_st ...