Agc012_E Camel and Oases
题目大意
坐标轴上有$n$个坐标,第$i$个坐标是$x_i$,初始你有一个容量$V$,当两个给定的坐标距离不超过$V$时,你可以从一个坐标到达另一个坐标,同时你还可以令$V=\lfloor \frac{V}{2}\rfloor$,并到达一个任意一个给定的坐标。
求对于每一个点是否存在一种方案使得从这个点出法能够到达每一个点至少一次。
题解
首先$V$的值只有$\log V$种,对于每一种取值,会有若干段下标连续的坐标可以互相到达,要求在每一层取一段使得所有坐标都被覆盖,题意即为在强制选第一层的某一段,是否存在合法方案。
考虑先预处理每一层每一个坐标能到达的最左和最右的坐标,再在忽略第一层的意义下将每一层是否被选中的状态压缩起来,求出用了某些层所能覆盖的最长前缀和后缀。
设某一选中的状态集合为$K$,全集为$S$,$K$所能覆盖的最长前缀为$Pre_K$,最长后缀为$Suf_K$。
枚举$K$,对于每一个$Pre_K$,求出它所对应的最长的$Suf$即为$F_{Pre_K}$,这个用$Suf_{S-K}$更新即可,要考虑$F_i+1$可以更新$F_i$。
所以最后枚举每一个坐标$i$,找到它第一层所在的段的左右端点$L,R$,看$F_{L-1}$是否能覆盖到$R$即可。
由于状态数是$2^{\log_2 V}$,所以它是严格小于$V$的,所以最终复杂度为$O(n\log V+V)$。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define M 200020
#define INF 1000001000
using namespace std;
const int BS=1<<19;char BF[BS],OT[BS],*SZ=OT,*HD,*TL;
const char *ED=OT+BS-1; int Top;
char Getchar(){if(HD==TL)TL=(HD=BF)+fread(BF,1,BS,stdin);return *HD++;}
void flush(){fwrite(OT,1,SZ-OT,stdout);}
void Putc(char c){*SZ++ =c;if(SZ==ED) flush(),SZ=OT;}
int read(){
int nm=0,fh=1; char cw=Getchar();
for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
void TK(bool x){
if(x) Putc('P'); else Putc('I'),Putc('m'),Putc('p'); Putc('o');
Putc('s'),Putc('s'),Putc('i'),Putc('b'),Putc('l'),Putc('e'),Putc('\n');
}
int tot,n,m,pos[M],L[M][21],R[M][21],V[40],rt;
int RF[M<<3],LF[M<<3],G[M],D[M],MAXN;
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) pos[i]=read(),D[i]=pos[i]-pos[i-1],G[i]=-(INF<<1);
while(m) V[tot++]=m,m>>=1; tot++;
for(int k=0;k<tot;k++){
for(int i=1;i<=n;i++){
R[i][k]=max(R[i-1][k]-1,1);
while(i+R[i][k]<=n&&D[i+R[i][k]]<=V[k]) R[i][k]++;
}
for(int i=n;i;i--){
L[i][k]=max(L[i+1][k]-1,1);
while(i-L[i][k]>0&&D[i-L[i][k]+1]<=V[k]) L[i][k]++;
}
} MAXN=(1<<tot);
for(int i=2;i<MAXN;i+=2){
for(int k=1;k<tot;k++){
int w=(1<<k); if(!(i&w)) continue;
LF[i]=max(LF[i],LF[i^w]+R[LF[i^w]+1][k]);
RF[i]=max(RF[i],RF[i^w]+L[n-RF[i^w]][k]);
} LF[i]=min(LF[i],n),RF[i]=min(RF[i],n);
}
for(int k=0;k<MAXN;k+=2) G[LF[k]]=max(G[LF[k]],RF[(MAXN-2)^k]);
for(int i=n-1;i>=0;i--) G[i]=max(G[i],G[i+1]);
for(int i=1;i<=n;i++) TK(G[i-L[i][0]]+R[i][0]+i-1>=n); flush();return 0;
}
Agc012_E Camel and Oases的更多相关文章
- AGC012 - E: Camel and Oases
原题链接 题意简述 沙漠中有个排成一条直线的绿洲,一头储水量为的骆驼. 骆驼有两个操作: 走到距离在V以内的一个绿洲. 飞到任意一个绿洲,但V减少一半.V=0时不能飞. 问骆驼依次从每个绿洲出发,能否 ...
- 【AtCoder】【模拟】【模型转化】Camel and Oases(AGC012)
题意: 有一个骆驼,n个绿洲遍布在数轴上,第i个绿洲的坐标为x[i],保证x[i]单增.骆驼的驼峰有体积初始值V.当驼峰的体积变为v的时候,驼峰中至多只能够存储v L的水.骆驼希望走完所有的绿洲,并且 ...
- 【AGC012E】 Camel and Oases ST表+状压dp
题目大意:一排点,两点间有距离. 初始你有一个行走值$v$,如果相邻两点距离不超过$v$你可以自由在这两点行走. 当$v$大于$0$时,你可以选择某一时刻突然飞到任意点,这样做后$v$会减半(下取整) ...
- 【agc012E】Camel and Oases
Portal --> agc012 Description 有一排点,两点间有一定距离,初始的时候有一个行走值\(v\),如果说两点间距离不超过\(v\),那么可以在这两点间自由行走,如果当前\ ...
- [AGC012E]Camel and Oases
题意:有$n$个数轴上的绿洲,给定它们的坐标,有一只骆驼想要访问所有绿洲,当它的驼峰容量为$V$时,它可以走到和当前绿洲距离$\leq V$的绿洲,并可以继续走,它也可以用一次跳跃到达任意一个绿洲,只 ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- 【AtCoder】AGC012
AGC012 A - AtCoder Group Contest 从最后开始间隔着取就行 #include <bits/stdc++.h> #define fi first #define ...
- A♂G&C012
A♂G&C012 A AtCoder Group Contest 从大到小sort后输出\(a_2+a_4+a_6+\ldots a_{2n}\) 好♂啊,只会背结论/kk B Splatte ...
- Camel运行原理分析
Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...
随机推荐
- iOS拓展:react-native创建工程的坑和解决方法
正文 首先,在创建工程之前,你需要有环境.这个网上很多,不赘述. 我们直接从创建工程开始,一步步记叙这过程. 坑一 一.打开终端,cd到你放文件的位置(我放在桌面了): yuqideMacBook-A ...
- github 答题
头脑王者 / 百万英雄 / 冲顶大会 / 芝士超人 自动答题:https://github.com/cxs1994/python_answer 头脑王者:https://github.com/sear ...
- ios开发:如何用js调用ios
本文转载至 :http://blog.chinaunix.net/uid-29415710-id-4058564.html - (BOOL)webView:(UIWebView *)webView s ...
- iOS解决导航引起视图高度问题
经过导航栏跨越的坑,总结出有两种方法可以无痕解决(前提>=iOS7版本)(TabBar与导航栏类似) 1.通过设置导航栏的透明度实现(这种方式的控制器view的起始坐标是充(0,64)开始的) ...
- 从 零开始 无差错 装好nginx+PHP
由于这两天 一直有人追问 nginx为何报错,为何php没装好啥的,大多原因是 : 1.编译与yum混合安装,导致很多包的路径不对,进而报错 2.yum源比较旧,导致 与新版本的php不匹配 3.安装 ...
- QT5的QDesktopSerivices不同
QT4使用QDesktopServices::storageLocation(QDesktopServices::xxxx)来获取一些系统目录, 现在则要改成QStandardPaths::writa ...
- vim复制多行
比如我要复制从第1行到第5行的数据,复制到第9行 光标移到第5行任意位置,输入ma光标移到第1行任意位置,输入y'a(这一定要打这个“'”单引号,否则就进入“INSERT”状态了光标移到需要复制的行, ...
- sql查询字段是否为空
sql 查询某字段为空 select * from 表名 where 字段名 is null sql 查询某字段不为空 select * from 表名 where 字段名 is not null s ...
- basic--factory
<?php /* 工厂模式: 由工厂类根据参数来决定创建出哪一种产品类的实例: 工厂类是指包含了一个专门用来创建其他对象的方法的类.所谓按需分配,传入参数进行选择,返回具体的类.工厂模式的最主要 ...
- html5 说明
# 客户端储存历程 远古时期 cookies的用法和缺陷 userdata HTML5时代 localstorage application cache 离线缓存 indexedeDB 客户端数据 ...