博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[AGC012E]Camel and Oases
阅读量:6487 次
发布时间:2019-06-24

本文共 1130 字,大约阅读时间需要 3 分钟。

题意:有$n$个数轴上的绿洲,给定它们的坐标,有一只骆驼想要访问所有绿洲,当它的驼峰容量为$V$时,它可以走到和当前绿洲距离$\leq V$的绿洲,并可以继续走,它也可以用一次跳跃到达任意一个绿洲,只不过这样会让驼峰容量变为$\left\lfloor\frac V2\right\rfloor$,问它可以从哪些位置开始使得最终可以到达所有绿洲

当$V$为定值时,它不跳跃就能到达的地方是许多个区间,每个区间内相邻两点距离$\leq V$,先对所有的$O(\log V)$个$V$预处理出这些区间,我们把$V'=\left\lfloor\frac V{2^i}\right\rfloor$时的这些区间称为第$i$层的区间

问题变为:硬点$0$层选一个区间,在$0$层以外每层选一个区间,使得这些区间的并是$[1,n]$,问是否可行

考虑状压,设$fl_i=x$表示在$i$状态的层中选了区间,最远能覆盖到$[1,x]$,转移就枚举不在$i$中的层$j$,加入$j$层中包含$fl_i$的右端点最大的区间即可,类似地定义$fr_i$,转移也是类似的,注意这里的状压不包括$0$层

最后对$0$层的每一个区间$[l,r]$,如果存在$x$使得$fl_x\geq l-1,fr_{all-x}\leq r+1$那么整个区间都可以,直接枚举所有$x$给区间打标记即可

状压DP那一步好厉害啊...

#include
void fmax(int&a,int b){ if(b>a)a=b;}void fmin(int&a,int b){ if(b
d?i:l[i-1]; r[n]=n; for(i=n-1;i>0;i--)r[i]=x[i+1]-x[i]>d?i:r[i+1]; l[0]=1; r[n+1]=n;}int fl[262144],fr[262144],s[200010];void gao(int l,int r){ if(l<=r){ s[l]++; s[r+1]--; }}int main(){ int V,M,i,j; scanf("%d%d",&n,&V); for(i=1;i<=n;i++)scanf("%d",x+i); for(M=0;V;V>>=1)pre(M++,V); pre(M,0); fr[0]=n+1; for(i=1;i<1<
>j&1){ fmax(fl[i],r[j+1][fl[i^(1<

转载于:https://www.cnblogs.com/jefflyy/p/9804637.html

你可能感兴趣的文章
Vue 2.0 入门系列(6)组件实例之消息框
查看>>
mac webstorm使用问题总结
查看>>
企业微服务中台落地实践和思想之我见
查看>>
Scala的设计目标——Martin Odersky访谈(二)
查看>>
IBM发布全球首台商用量子计算机
查看>>
麦当劳数字化转型中获得的6个数据科学经验
查看>>
Fake 5提供.NET Core支持
查看>>
如何通过StackStorm自动支持2万多台服务器
查看>>
Apache发布Groovy 2.5正式版及3.0预览版
查看>>
Propel: 由Node.js之父创建的JavaScript科学计算库
查看>>
如何将C# 7类库升级到C# 8?使用可空引用类型
查看>>
Raider对F#支持的技术细节
查看>>
HTML5的问题与机遇
查看>>
中国互联网上市科技公司市值蒸发了多少亿?
查看>>
Microsoft正式发布Azure IoT Hub与Event Grid的集成
查看>>
“计算机之子”winter:我的前端学习路线与方法
查看>>
每日生产万亿消息数据入库,腾讯如何突破大数据分析架构瓶颈
查看>>
为什么携程要做好持续交付?
查看>>
伯克利与微软联合发布Blink:使GPU计算实现高达2倍加速
查看>>
金山云最新财报:Q4营收7.27亿,同比增长81%
查看>>