【HNOI2017】大佬-dalao
题面
解法
bfs+DPbfs+DP:
这道题的想法很妙,问了本校的很多大佬之后才搞懂。
我们可以发现,刷题长自信值和回嘴/怼大佬是两个独立的过程,如果我们能够在保证自己的自信值≥0≥0的同时使得可以不用刷题的天数尽可能多,那么我们就可能打败大佬。
所以我们设f[i][j]f[i][j]表示前i天,自信值为j时最多有多少天不用刷题,d[f][l]d[f][l]变成讽刺能力为f,等级为l需要的最少天数,假设这个最大值为D,
假设当前大佬的自信值为x,f[i][j]f[i][j]的最大值为D,假设进行两次怼的操作,所需要的天数和造成的伤害分别为d1,f1,d2,f2
那么当满足:D-d1-d2>=C-f1-f2时就可以怼死大佬(d1,f1,d2,f2可以为0)
这样理解:怼两次大佬不能直接怼死了,必须要怼到刚刚好,即D>=d1+d2,C=f1+f2;或者说没有刚刚好,大佬还剩下C-f1-f2的自信值,自己还剩下D-d1-d2的天数,那么就可以还嘴把大佬搞死
所以我们可以用DP求出f数组,用bfs求出d数组,求出来之后就可以解答。
对于每一个大佬,我们把状态按照f排序,枚举其中一次怼的造作,用单调指针来扫另一次怼操作,记录另一次怼的最小值,如果发现满足等式那就可以直接输出1了。
复杂度
O(n∗mc+玄学+m∗cntn*mc+玄学+m*cnt),玄学就是bfs的状态数,不是很多,cnt是合法的状态数
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<map>
#define Rint register int
#define Lint long long int
using namespace std;
const int INF=0x3f3f3f3f;
const int N=6010;
struct node
{int d,f;bool operator < (const node &a) const{return f<a.f;}
}p[N*220];
int a[N],w[N],c[N],q[N*220],F[N*220],L[N*220];
int n,m,mc,mx,D,cnt;
int f[N][N];
map<int,map<int,int> > d;
void bfs()
{int h=0,t=1;F[t]=1,L[t]=0,d[1][0]=q[t]=1;//赋初值,F为讽刺能力,L为等级while( h<t ){h++;int tmp=d[F[h]][L[h]];if( tmp>=D ) continue ;int x=F[h],y=L[h];if( !d[x][y+1] ){F[++t]=x,L[t]=y+1;d[x][y+1]=q[t]=tmp+1;}if( (Lint)x*(Lint)y<=1ll*mx && !d[x*y][y] ){F[++t]=x*y,L[t]=y;d[x*y][y]=q[t]=tmp+1;}}p[++cnt]=(node){ 0,0 };for(int i=1;i<=t;i++) p[++cnt]=(node){ q[i],F[i] };sort( p+1,p+cnt+1 );
}
bool judge(int x)
{int j=1,v=INF;for(int i=cnt; i ;i--){while( p[i].f+p[j].f<=x && i>j ) v=min( v,p[j].d-p[j].f ),j++;if( D-x>=v+p[i].d-p[i].f ) return 1;}return 0;
}
int main()
{freopen("dalao.in","r",stdin);freopen("dalao.out","w",stdout);scanf("%d%d%d",&n,&m,&mc);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) scanf("%d",&w[i]);for(int i=1;i<=m;i++){scanf("%d",&c[i]);mx=max( mx,c[i] );}memset( f,-1,sizeof f );f[0][mc]=0;for(int i=1,x;i<=n;i++)for(int j=a[i];j<=mc;j++){f[i][j-a[i]]=max( f[i][j-a[i]],f[i-1][j]+1 );x=min( mc,j-a[i]+w[i] );f[i][x]=max( f[i][x],f[i-1][j] );}for(int i=0;i<=n;i++) for(int j=0;j<=mc;j++) D=max( D,f[i][j] );bfs();for(int i=1;i<=m;i++)if( judge( c[i] ) ) printf("1\n");else printf("0\n");return 0;
}
【HNOI2017】大佬-dalao相关推荐
- [AH/HNOI2017]大佬
题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...
- [AH2017/HNOI2017] 大佬
大佬每天给出的伤害是固有的,设dp[i,j]表述使得前i天结束时我的自信为j最少做水题的天数.D=max(i-dp[i,j])就是总共拿来给伤害的最大天数.打伤害一类是固定的伤害1,一类是积累伤害打出 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- 退役前的最后的做题记录upd:2019.04.04
考试考到自闭,每天被吊打. 还有几天可能就要AFO了呢... Luogu3602:Koishi Loves Segments 从左向右,每次删除右端点最大的即可. [HEOI2014]南园满地堆轻絮 ...
- # HNOI2012 ~ HNOI2018 题解
HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...
- AC日记——「HNOI2017」礼物 LiBreOJ 2020
#2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ...
- 大数据挑战赛(大佬篇)
相对于我的杂乱无章,dalao们做比赛时将每个环节分文件处理,这样好看也好改,分别分为以下几个步骤: 1.数据处理 2.特征选择 3.调参 4.模型融合 5.过拟合的处理 在做特征提取时,可以提取得到 ...
- My dear dalao please daidai wo。
文/高哥 后来很少水群了,因为大佬太多了.前几天加了个技术群,本来进去是交流技术的,结果进去都特么是谈炒股的,我观察了下,估计有不少人会入坑.韭菜被割了一茬又一茬,还是嘴里不停喊着"My d ...
- dalao自动报表邮件2.0
经过昨天的修改优化后,dalao收到了不是"木马"的邮件,欣慰地点了点头,"不错,不错,这几张表设计的简洁明了,看着有货!不过呀,,,这些表的数据太多了一点,十几天的数据 ...
最新文章
- Vivado IP的两种综合方式:Global 和 Out-Of-Context
- 纸质图书与电子图书的营销策略研究
- 常用LINQ关键字用法汇总
- mysql 分组top_MySQL:如何查询出每个分组中的 top n 条记录?
- 序列化(串行化)- 使用BinaryFormatter进行序列化
- mysql redis hbase_10分钟梳理MySQL核心知识点
- java求梯形面积程序_Java初级应用,计算关于梯形跟圆形的面积。该程序中有3个类:Lader、Circle和主类Test。...
- mysql update 批量修改数据_MySQL 中实现数据的批量修改
- redis---队列的操作
- JS中style属性
- matplotlib易混概念理解与画图详解
- PCL1.8.0 error C4996: 'pcl::SAC_SAMPLE_SIZE'编译错误
- NBA比赛数据table表格
- java分页前端怎么实现_JavaWeb前端分页显示方法
- 嵌入式软件开发工程师未来的薪资待遇是什么情况
- 《微微一笑很倾城》中肖奈大神说的平方根倒数速算法是什么鬼?三十分钟理解!...
- 宿舍的呼噜神,快看过来,我这里有药!!!
- Windows下通过远程桌面连接向远程电脑传输文件
- 我关注的一些技术微信公众号
- 世界人工智能大会倒计时30天,这些亮点不容错过