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

  首先令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的最大值就可以了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<map>
  8. using namespace std;
  9. int read()
  10. {
  11. int x=,f=;char c=getchar();
  12. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  13. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  14. return x*f;
  15. }
  16. #define N 110
  17. #define inf 100000001
  18. int n,m,Q,a[N],w[N],f[N][N],head,tail;
  19. map<long long,bool> g;
  20. struct data
  21. {
  22. int d,l,w;
  23. bool operator <(const data&a) const
  24. {
  25. return w<a.w;
  26. }
  27. }q[];
  28. long long calc(int x,int y){return 1ll*(n+)*x+y;}
  29. void bfs()
  30. {
  31. q[tail=]=(data){,,};g[calc(,)]=;
  32. do
  33. {
  34. head++;if (q[head].d==n) break;
  35. 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};
  36. 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};
  37. }while (head<tail);
  38. }
  39. int main()
  40. {
  41. #ifndef ONLINE_JUDGE
  42. freopen("bzoj4828.in","r",stdin);
  43. freopen("bzoj4828.out","w",stdout);
  44. const char LL[]="%I64d";
  45. #else
  46. const char LL[]="%lld";
  47. #endif
  48. n=read(),Q=read(),m=read();
  49. for (int i=;i<=n;i++) a[i]=read();
  50. for (int i=;i<=n;i++) w[i]=read();
  51. memset(f,,sizeof(f));
  52. f[][m]=;
  53. for (int i=;i<n;i++)
  54. for (int j=a[i+];j<=m;j++)
  55. {
  56. f[i+][min(m,j-a[i+]+w[i+])]=max(f[i+][min(m,j-a[i+]+w[i+])],f[i][j]);
  57. f[i+][j-a[i+]]=max(f[i+][j-a[i+]],f[i][j]+);
  58. }
  59. int v=;
  60. for (int i=;i<=n;i++)
  61. for (int j=;j<=m;j++)
  62. v=max(v,f[i][j]);
  63. n=v;
  64. bfs();
  65. sort(q+,q+tail+);
  66. q[].d=q[].l=q[].w=;
  67. while (Q--)
  68. {
  69. int x=read(),mx=-inf,p=-;
  70. int flag=;
  71. for (int j=tail;j>=;j--)
  72. {
  73. while (p<tail&&q[p+].w+q[j].w<=x)
  74. p++,mx=max(mx,q[p].w-q[p].d);
  75. if (q[j].w-q[j].d+mx+n>=x) {flag=;break;}
  76. }
  77. cout<<flag<<endl;
  78. }
  79. return ;
  80. }

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. saltstack学习之一:服务架构以及相关配置安装运行

    概要 saltstack是基于Python开发的C/S架构的一款批量管理工具,底层采用动态的连接总线(ZeroMQ消息队列pub/sub方式通信),使用ssl证书签发的方式进行认证管理,使其可以用于编 ...

  2. NB-IoT协议及其PSM

    物联网技术发展趋势是LPWAN,其中尤其以NB-IoT和eMTC最为代表.NB-IoT和eMTC各有优劣,使用场景互有不同. 低功耗可以说是物联网技术的核心,本着关注低功耗的方向,适当了解NB IoT ...

  3. Attention[Content]

    0. 引言 神经网络中的注意机制就是参考人类的视觉注意机制原理.即人眼在聚焦视野区域中某个小区域时,会投入更多的注意力到这个区域,即以"高分辨率"聚焦于图像的某个区域,同时以&qu ...

  4. C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出

    差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...

  5. python 文本特征提取 CountVectorizer, TfidfVectorizer

    1. TF-IDF概述 TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与文本挖掘的常用加权技术.TF-IDF是一种统计方法,用以评 ...

  6. Flutter - 创建自适应的Android app 图标

    上一篇文章说到  Flutter - 自动生成Android & iOS图标 通过flutter_launcher_icons 可以一键生成所有的Icon 到此基本什么问题也没有,如果你用io ...

  7. 如何在《救赎之路》中使用CPU粒子效果

    Unreal游戏引擎4.19版本的发布,可以使得游戏可以更好地利用Intel多核心处理器的性能,以提供更精彩的游戏体验.这里以<救赎之路>这款优秀的国产独立游戏为例说明如何在游戏中使用CP ...

  8. linux下文件加密方法总结

    为了安全考虑,通常会对一些重要文件进行加密备份或加密保存,下面对linux下的文件加密方法做一简单总结: 方法一:gzexe加密这种加密方式不是非常保险的方法,但是能够满足一般的加密用途,可以隐蔽脚本 ...

  9. Maven 项目生成或者update jdk变为1.5的问题

    在使用Maven构建项目时,生成的maven项目jdk默认使用的是jdk1.5. 在手动修改了jdk之后,update project之后jdk又会变为1.5. 或者用eclipse的Maven插件生 ...

  10. MariaDB第三章(select)

    基本查询 --查询基本使用(条件,排序,聚合函数,分组,分页) --创建学生表 create table students ( id int unsigned not null auto_increm ...