这真的是一道综合题。然而感觉A得莫名其妙,交上去的时候其实非常虚,然后就莫名其妙地AC了?


首先我们考虑到,所有和怼有关的操作都是时刻无关的。也就是说,我们把这些操作拆散放到任何时候都对结果不会有影响。因此我们考虑把这些操作剥离出来。换言之,我们可以把所有2操作剥离出来。

为什么剥离2号操作呢?因为只要二号操作和自己的生命有关(你不妨理解为xu`ming)。也只有这一种操作时与时刻有关的。什么叫做与时刻有关呢?就是说,这批操作,放在1-3时间点执行是可以的,而放在8-10时间点执行可能就会GameOver。

考虑到其余操作的时刻无关性,我们只需要丢给它们一个单一量\(D\)表示最大空余天数就可以了。

注意这个天数为何要取最大?因为这个天数是益多不宜少的。毕竟时间多的话可以拿来刷水题,少的话就要gg了。

得到的天数以后,我们可以考虑对大佬的事情。

首先我们发现把1号操作单独作为一种决策太浪费了,毕竟它是那样的有规律。我们不妨将1号操作扔进最后的状态判断里。

现在不管一号操作,我们就只有最多两次怼的机会。最多两次?最多两次?

看到这里应该已经能想到单调性了。如果我们第一次怼多,第二次必然怼少,才能满足要求。那么,究竟要满足什么样的要求呢?

我们这样考虑。假设第一次怼的消耗与天数分别是\(f_i, d_i\),第二次是\(f_j, d_j\),那么显然有

\(f_i+f_j <= c\)

同时还有

\(f_i+f_j+(D-d_i-d_j)>=c\)

将第二个式子变形为

\(f_i-d_i+f_j-d_j>=c-D\)

使用尺取法。在以\(f\)为第一关键字排序后,将\(j\)从右向左扫描,同时不断更新合法的\(i\)。考虑到如果一个\(i\)合法,那么任意\(k<=i\)必然合法,于是我们记录一个前缀最大值,但是记录的是\(f_k+d_k (k<=i)\)的最大值。每刷出\((i,j)\)的时候,用这个值去更新答案,看看是否大于\(c-D\)。如果大于那么该情况成立。否则继续直到大于为止。如果找不到,那就意味着该情况不成立了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int Mod=2332831, Multi=1000007;
  4. int n,m,mc,a[1005],w[1005],c[1005],b[1005][1005],D,C;
  5. struct Dui { int f,d,l; };
  6. Dui makedui(int _f,int _d,int _l) {Dui ret;ret.f=_f;ret.d=_d;ret.l=_l;return ret;}
  7. vector <Dui> dui;
  8. bool cmp(const Dui &a, const Dui &b) {
  9. return a.f==b.f?a.d<b.d:a.f<b.f;
  10. }
  11. bool equ(const Dui &a, const Dui &b) {
  12. return a.f==b.f;
  13. }
  14. struct Hashchecker{
  15. vector <pair<int,int> > tab[Mod+2];
  16. void insert(int x,int y) {
  17. int key=(x+y*Multi)%Mod;
  18. tab[key].push_back(make_pair(x,y));
  19. }
  20. bool query(int x,int y) {
  21. int key=(x+y*Multi)%Mod;
  22. for(int i=0;i<tab[key].size();i++)
  23. if(tab[key][i].first==x && tab[key][i].second==y)
  24. return true;
  25. return false;
  26. }
  27. } mp;
  28. queue <Dui> q;
  29. void bfs() {
  30. q.push(makedui(1,1,0)); dui.push_back(makedui(1,1,0));
  31. mp.insert(1,1);
  32. while(q.size()){
  33. Dui p=q.front(); q.pop();
  34. if(p.d>=D) break;
  35. Dui now1=makedui(p.f,p.d+1,p.l+1);
  36. q.push(now1);
  37. if((long long)p.f * (long long)p.l>C) continue;
  38. Dui now2=makedui(p.f*p.l,p.d+1,p.l);
  39. if(now2.f==0||now2.l==0) continue;
  40. if(!mp.query(now2.f,now2.d))
  41. q.push(now2), mp.insert(now2.f,now2.d),
  42. dui.push_back(makedui(now2.f,now2.d,now2.l));
  43. }
  44. }
  45. int main() {
  46. cin>>n>>m>>mc;
  47. for(int i=1;i<=n;i++) cin>>a[i];
  48. for(int i=1;i<=n;i++) cin>>w[i];
  49. for(int i=1;i<=m;i++) cin>>c[i],C=max(C,c[i]);
  50. for(int i=1;i<=n;++i)
  51. for(int j=a[i];j<=mc;++j){
  52. b[i][j-a[i]]=max(b[i-1][j]+1,b[i][j-a[i]]);
  53. b[i][min(j-a[i]+w[i],mc)]=max(b[i-1][j],b[i][min(j-a[i]+w[i],mc)]);
  54. }
  55. for(int i=1;i<=n;i++) {
  56. for(int j=0;j<=mc;j++)
  57. /*cout<<b[i][j]<<" ",*/ D=max(b[i][j],D);
  58. //cout<<endl;
  59. }
  60. //cout<<"!!!" << D<<endl;
  61. bfs();
  62. //cout<<dui.size()<<endl;
  63. int avg=0;
  64. for(int i=0;i<Mod;i++) avg=max(avg,(int) mp.tab[i].size());
  65. //cout<<avg<<endl;
  66. dui.push_back(makedui(1,1,0));
  67. dui.push_back(makedui(0,0,0));
  68. sort(dui.begin(),dui.end(),cmp);
  69. vector <Dui>::iterator new_end = unique(dui.begin(),dui.end(),equ);
  70. dui.erase(new_end,dui.end());
  71. //cout<<dui.size()<<endl;
  72. //for(int i=0;i<dui.size();i++) cout<<dui[i].f<<" "<<dui[i].d<<" "<<dui[i].l<<endl;
  73. for(int i=1;i<=m;i++) {
  74. int uc=c[i],flag=0;
  75. int pin1=0,pin2=dui.size()-1,mx=-1e+8;
  76. for(;pin2>=0;--pin2) {
  77. while(dui[pin1].f+dui[pin2].f<=uc) { mx=max(mx,dui[pin1].f-dui[pin1].d); pin1++; }
  78. if(pin1>pin2) break;
  79. //cout<<"pin1 = "<<pin1<<" , pin2 = "<<pin2<<" , mx = "<<mx<<endl;
  80. if(pin1 && mx+dui[pin2].f-dui[pin2].d>=uc-D) {flag=1; break;}
  81. }
  82. cout<<flag<<endl;
  83. }
  84. }

[HNOI2017] 大佬 - DP,BFS,Hash,单调性的更多相关文章

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

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

  2. [AH2017/HNOI2017]大佬

    题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...

  3. 【题解】HNOI2017大佬

    哎……做了几个小时最后还是没能想到怼大佬的合法性到底怎么搞.写暴力爆搜感觉复杂度爆炸就没敢写 bfs / dfs 一类,后来发现在种种的约束条件下(远小于所给的 \(n, m\))复杂度完全是可以承受 ...

  4. 【BZOJ】1054: [HAOI2008]移动玩具(bfs+hash)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1054 一开始我还以为要双向广搜....但是很水的数据,不需要了. 直接bfs+hash判重即可. # ...

  5. hdu 3247 AC自动+状压dp+bfs处理

    Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Ot ...

  6. [BZOJ1054][HAOI2008]移动玩具 bfs+hash

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2432  Solved: 1355[Submit][Stat ...

  7. BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS

    BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...

  8. BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs

    BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...

  9. HDU-1043 Eight八数码 搜索问题(bfs+hash 打表 IDA* 等)

    题目链接 https://vjudge.net/problem/HDU-1043 经典的八数码问题,学过算法的老哥都会拿它练搜索 题意: 给出每行一组的数据,每组数据代表3*3的八数码表,要求程序复原 ...

随机推荐

  1. C#设计模式学习笔记:(12)代理模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7814004.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第七个模式,也是 ...

  2. jQuery 源码解析(三十一) 动画模块 便捷动画详解

    jquery在$.animate()这个接口上又封装了几个API,用于进行匹配元素的便捷动画,如下: $(selector).show(speed,easing,callback)        ;如 ...

  3. float布局打破标准流,神助攻clear清浮动

    布局是什么?根据功能划分小块,再根据设计稿还原,书写静态页面,然后再在块里面填充内容,完善功能,js施加交互效果.div作为一个容器,独占一行,代码书写习惯从上至下属于标准流,而浮动float的css ...

  4. Ubuntu 1910安装Openshift 4.0单机版 (CRC)

    Openshift默认可以在CentOS等RHEL系的发行版上安装. 本文转述一下如何在Ubuntu 1910上安装Openshift4.0单机版(CRC). 原文请参考:  https://gith ...

  5. 什么是AOP面向切面编程思想

    一.什么是AOP? 1.AOP不是一种语言,是一种编程范式 常见的编程范式: 面向过程.面向对象.函数式编程.事件驱动编程等 2.AOP可以解决特定问题,不能解决所有问题. 3.是面向对象的补充,不是 ...

  6. workerman离线推送方案

    方案一:目前网上比较流行的 方案二:参考腾迅IM

  7. 使用CSV Data Set Config配置原件,参数化数据

    对接口数据的参数化方式大概有三种方式,1:jmeter内置函数:2:借助CSV Data Set Config配置原件:3:jdbc连接数据库,使用数据表字段 此处主要讲第二种:借助CSV Data ...

  8. 选择排序 C++实现

    实现思想: 1.寻找[i, n)区间里的最小值min ( i>= 0 ) 2.交换min和第i的数 ( i>= 0 ) #include <iostream> #include ...

  9. 高精度模板 支持各种运算 c++

    绪言 自从有了高精度模板,妈妈再也不用怕我不会打高精度了! 代码 代码长度与日俱增啊~~~ #include<iostream> #include<cstring> #incl ...

  10. position定位及实际应用

    position: static;  静态定位 / 常规定位 / 自然定位 忽略top/right/bottom/left/z-index的影响,使元素回到自然流中 <!DOCTYPE html ...