题目描述

人们总是难免会碰到大佬。他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语。 你作为一个 OIER,面对这样的事情非常不开心,于是发表了对大佬不敬的言论。 大佬便对你开始了报复,你也不示弱,扬言要打倒大佬。

现在给你讲解一下什么是大佬,大佬除了是神犇以外,还有着强大的自信心,自信程度可以被量化为一个正整数 C( 1<=C<=10^8), 想要打倒一个大佬的唯一方法是摧毁 Ta 的自信心,也就是让大佬的自信值等于 0(恰好等于 0,不能小于 0)。 由于你被大佬盯上了,所以你需要准备好 n(1<=n<=100)天来和大佬较量,因为这 n 天大佬只会嘲讽你动摇你的自信,到了第n+1 天,如果大佬发现你还不服,就会直接虐到你服,这样你就丧失斗争的能力了。

你的自信程度同样也可以被量化,我们用 mc (1 <= mc <= 100)来表示你的自信值上限。

在第 i 天( i>=1),大佬会对你发动一次嘲讽,使你的自信值减小 a[i],如果这个时刻你的自信值小于 0 了,那么你就丧失斗争能力,也就失败了(特别注意你的自信值为 0 的时候还可以继续和大佬斗争)。 在这一天, 大佬对你发动嘲讽之后,如果你的自信值仍大于等于 0,你能且仅能选择如下的行为之一:

  1. 还一句嘴,大佬会有点惊讶,导致大佬的自信值 C 减小 1。
  2. 做一天的水题,使得自己的当前自信值增加 w[i], 并将新自信值和自信值上限 mc 比较,若新自信值大于 mc,则新自信值更新为 mc。例如, mc=50, 当前自信值为 40, 若w[i]=5,则新自信值为 45,若 w[i]=11,则新自信值为 50。
  3. 让自己的等级值 L 加 1。
  4. 让自己的讽刺能力 F 乘以自己当前等级 L,使讽刺能力 F 更新为 F*L。
  5. 怼大佬,让大佬的自信值 C 减小 F。并在怼完大佬之后,你自己的等级 L 自动降为 0,讽刺能力 F 降为 1。由于怼大佬比较掉人品,所以这个操作只能做不超过 2 次。

特别注意的是,在任何时候,你不能让大佬的自信值为负,因为自信值为负,对大佬来说意味着屈辱,而大佬但凡遇到屈辱就会进化为更厉害的大佬直接虐飞你。在第 1 天,在你被攻击之前,你的自信是满的(初始自信值等于自信值上限 mc), 你的讽刺能力 F 是 1, 等级是 0。

现在由于你得罪了大佬,你需要准备和大佬正面杠,你知道世界上一共有 m( 1<=m<= 20)个大佬,他们的嘲讽时间都是 n 天,而且第 i 天的嘲讽值都是 a[i]。不管和哪个大佬较量,你在第 i 天做水题的自信回涨都是 w[i]。 这 m 个大佬中只会有一个来和你较量( n 天里都是这个大佬和你较量),但是作为你,你需要知道对于任意一个大佬,你是否能摧毁他的自信,也就是让他的自信值恰好等于 0。和某一个大佬较量时,其他大佬不会插手。

题解

非常有意思的一道题、

我们观察到在每一轮中,进攻:1,3,4,5与防守:2是分别独立的,所以我们可以将这两件事分开考虑。

我们的一个策略就是一防守为主,并且能够抽出更多的时间进攻。

观察到关于自己的自信值的值域较小,可以用背包\(dp\)求出期间最多能抽出多少时间来进攻。

然后有一个直观的想法就是我们同样\(dp\)出进攻的最优方案。

但这样是有问题的。

因为这道题有一个奇怪的限制就是总伤害不能大于敌方血量,所以直接\(DP\)就\(GG\)了。

观察到我们进攻的方案数可能不是太多?然后我们可以\(BFS+hash\)把所有的情况搜索出来。

现在我们有一堆二元组\((f,d)\),我们需要选出0个,1个或者2个来满足:

\[f1+f2\leq C\ \ \ \ f1+f2+(D-d1-d2)\geq C
\]

即在满足第一个限制的同时要尽可能让\(f2-d2\)更大。

这就是一个决策单调性的问题了,对于所有的这种二元组,按照\(f\)为第一关键字升序排序,按照\(d\)为第二关键字降序排序,从后往前枚举第一个二元组,双指针卡第二个元素即可。

代码

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<map>
#define mm make_pair
#define P pair<int,int>
#define N 109
using namespace std;
typedef long long ll;
typedef unsigned int ull;
const int mod=19260817;
const ll maxc=1e8;
int dead,n,m,f[N][N],top,a[N],w[N],mc;
P st[N*N*N*8];
inline int rd(){
int x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
inline bool cmp(P a,P b){
if(a.first!=b.first)return a.first<b.first;
else return a.second>b.second;
}
struct node{
int d,l,f;
inline bool operator <(const node &b)const{
if(d!=b.d)return d<b.d;
else if(l!=b.l)return l<b.l;
else return f<b.f;
}
};
queue<node>q;
struct hm{
int head[mod+2],tot;
struct edge{
int n;ull to;
}e[N*N*N*80];
inline bool insert(node x){
ull ans=0;
ans=1ull*(1ull*x.d*233+x.l)*233+(unsigned int)x.f;
int u=ans%mod;
for(int i=head[u];i;i=e[i].n){
ull v=e[i].to;
if(v==ans)return 1;
}
e[++tot].n=head[u];e[tot].to=ans;head[u]=tot;
return 0;
}
}mp;
inline void bfs(){
q.push(node{1,0,1});
while(!q.empty()){
node u=q.front();q.pop();
if(u.d==dead)continue;
// if(mp.find(node{u.d+1,u.l+1,u.f})==mp.end()){
q.push(node{u.d+1,u.l+1,u.f});
// mp[node{u.d+1,u.l+1,u.f}]=1;
// }
if(1ll*u.f*u.l>maxc||mp.insert(node{u.d+1,u.l,u.f*u.l}))continue;
q.push(node{u.d+1,u.l,u.f*u.l});
st[++top]=mm(u.f*u.l,u.d+1);
}
}
int main(){
n=rd();m=rd();mc=rd();
for(int i=1;i<=n;++i)a[i]=rd();
for(int i=1;i<=n;++i)w[i]=rd();
memset(f,-0x3f,sizeof(f));
f[0][mc]=0;
for(int i=0;i<n;++i){
for(int j=0;j<=mc;++j)if(j>=a[i+1]){
f[i+1][j-a[i+1]]=max(f[i][j]+1,f[i+1][j-a[i+1]]);
f[i+1][min(mc,j-a[i+1]+w[i+1])]=max(f[i][j],f[i+1][min(mc,j-a[i+1]+w[i+1])]);
}
for(int j=0;j<=mc;++j)dead=max(dead,f[i][j]);
}
bfs();
sort(st+1,st+top+1,cmp);
top=unique(st+1,st+top+1)-st-1;
while(m--){
int nowc=rd();
int p=0,tag=0,maxx=0,nowf=0;
for(int i=top;i>=1;--i){
int f1=st[i].first,d1=st[i].second;
while(p<top&st[p+1].first+f1<=nowc){
++p;
if(st[p].first-st[p].second>maxx){
nowf=st[p].first;maxx=st[p].first-st[p].second;
}
}
if(nowf+f1<=nowc&&maxx+f1-d1+dead>=nowc){tag=1;break;}
}
printf("%d\n",tag);
}
return 0;
}

[AH2017/HNOI2017]大佬的更多相关文章

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

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

  2. 洛谷P3724 [AH2017/HNOI2017]大佬(决策单调性)

    传送门 这个思路很妙诶->这里 以下为了方便,我把自信说成血量好了 虽然表面上看起来每一天有很多种选择,然而我们首先要保证的是不死,然后考虑不死的情况下最多能拿出多少天来进行其他操作.不死可以d ...

  3. P3724 [AH2017/HNOI2017]大佬

    传送门 发现保持自信和做其他事情互不干扰,可以直接做一次 $dp$ 求出最多能空出几天来怼大佬 然后就变成给你若干天,是否能怼死大佬,考虑求出所有的 天数和输出的嘲讽值集合,因为天数不多,嘲讽值增长很 ...

  4. #10 [AH2017/HNOI2017]大佬

    题解: 题意看上去挺复杂的 分析一下就能发现自己的自信是没啥用的 只要随便dp一下看看最多能有多少天不使用增加自信 然后问题就变成了 求C1+C2+k=C 然后发现C有10^8 显然枚举C1是不行的了 ...

  5. P3723 [AH2017/HNOI2017]礼物

    题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1      c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ...

  6. 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告

    P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...

  7. [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)

    题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...

  8. 笔记-[AH2017/HNOI2017]礼物

    笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ...

  9. 洛谷P3724 大佬 [AH2017/HNOI2017] dp+bfs

    正解:dp+bfs 解题报告: 传送门! 这题看起来很复杂的样子其实真的很复杂 但是仔细看一下题目,会发现其实操作只有两个目的嘛,一个是保证自己不死,一个是让对手减血 而且保证自己不死只有一种操作 而 ...

随机推荐

  1. Java开发笔记(八十七)随机访问文件的读写

    前面介绍了字符流读写文件的两种方式,包括文件字符流和缓存字符流,但是它们的写操作都存在一个问题:不管是write方法还是append方法,都只能从文件开头写入,而不能追加到文件末尾或者在文件中间某个位 ...

  2. HttpServletRequest内容处理工具类

    目录 HttpServletRequestUtil类 (可转换成json数据,xml数据,map数据) HttpServletRequestUtil类 import javax.servlet.htt ...

  3. Python 标准类库 - 因特网协议与支持之socketserver

    标准类库 - 因特网协议与支持之socketserver by:授客 QQ:1033553122 socketserver 模块,简化网络服务编写任务. 创建服务的步骤 1  通过子类化BaseReq ...

  4. 未找到导入的项目“C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Props”

    未找到导入的项目“C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Props” ...

  5. nginx+uwsgi部署django项目

    1.django项目部署前需要生成admin的静态资源文件 (1)生成admin的静态资源文件 # 关闭debug模型 DEBUG = False # 允许所有域名访问 ALLOWED_HOSTS = ...

  6. 查看Eclipse版本号及各个版本区别

    1. 找到eclipse安装目录 2. 进入readme文件夹,打开readme_eclipse.html 3. readme_eclipse.html呈现的第二行即数字版本号,如: Eclipse ...

  7. Centos7上搭建redis主从

    1. 节点(服务器)数量说明 按照redis官方建议:salve和master的数量按照2n+1台服务器(1台master节点,2n台slave节点) 有兴趣的可以了解下redis的master选举机 ...

  8. socket.io 出现的WebSocket is closed before the connection is established

    WebSocket is closed before the connection is established 最近socket.io是挺流行的,幼麟棋牌和一些好的开源项目也使用这个框架,在搭建其平 ...

  9. Raneto中文搜索支持

    背景 因业务部门需要在线软件使用说明文档,但我们资源不足,故我想找一个开源的知识库,发现 Raneto不错,决定使用. 官方文档相当清晰,部署完成,发布一些文章,启动项目,交由业务同事测试使用,于是我 ...

  10. 服务消费者Feign和Ribbon的区别

    1.Ribbon通过注解@EnableEurekaClient/@EnableDiscoveryClient向服务中心注册:    PS:选用的注册中心是eureka,那么就推荐@EnableEure ...