传送门

题目大意

坐标轴上有$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;
}

转载于:https://www.cnblogs.com/OYJason/p/9805019.html

Agc012_E Camel and Oases相关推荐

  1. AGC012 - E: Camel and Oases

    原题链接 题意简述 沙漠中有n(n≤2×105)个排成一条直线的绿洲,一头储水量为V(V≤2×105)的骆驼. 骆驼有两个操作: 走到距离在V以内的一个绿洲. 飞到任意一个绿洲,但V减少一半.V=0时 ...

  2. agc012E Camel and Oases(状压dp+思路题)

    这题神啊.状压dp你敢信?思维难度爆表还有一堆细节要注意???orz Visjiao 原题链接:http://agc012.contest.atcoder.jp/tasks/agc012_e 大神题解 ...

  3. AT2365-[AGC012E]Camel and Oases【状压dp】

    正题 题目链接:https://www.luogu.com.cn/problem/AT2365 题目大意 一个数轴上有nnn个点,开始你有个水壶容量为VVV,你每次有两个操作 走到一个距离与你不超过V ...

  4. [agc012e]Camel and Oases

    前言 很容易的就发现了只有log次跳跃. 然后状压DP. 似乎就是个简单题吧(怎么比12c还简单) 题意 一排点,两点间有距离. 初始你有一个行走值v,如果相邻两点距离不超过v你可以自由在这两点行走. ...

  5. 【agc012E】Camel and Oases

    Portal --> agc012 Description 有一排点,两点间有一定距离,初始的时候有一个行走值\(v\),如果说两点间距离不超过\(v\),那么可以在这两点间自由行走,如果当前\ ...

  6. 【DP】AGC012 E Camel and Oases

    分析: 有点套路的状压题 很显然,最多logV层,所以可以记录每一层的选取状态(第一层保证不能选). 定义f1(mask)f1(mask)f1(mask)表示选取状态为mask时,从最左端开始连续覆盖 ...

  7. AtCoder Grand Contest 012 E Camel and Oases 状压dp

    Description 有一个容量为V的包,n个接水点,坐标分别为x[] 有两种移动方式: 若两个接水点之间的距离不超过此时包的容量v,那么就可以移动 若此时v不等于0,那么可以使v=v/2(下取整) ...

  8. 【AtCoder】【模拟】【模型转化】Camel and Oases(AGC012)

    题意: 有一个骆驼,n个绿洲遍布在数轴上,第i个绿洲的坐标为x[i],保证x[i]单增.骆驼的驼峰有体积初始值V.当驼峰的体积变为v的时候,驼峰中至多只能够存储v L的水.骆驼希望走完所有的绿洲,并且 ...

  9. AtCoder Grand Contest 012 E - Camel and Oases 状压dp

    题意 平面上有n个点.初始有V的权值,每次可以从一个点走到与他距离不超过V的点,当V>0时也可以让V/2且到达任意一个点.问从每个点出发能否遍历所有点. n,V<=200000 分析 显然 ...

最新文章

  1. hdu 1175 连连看
  2. python 小波去噪,用Pywavelet去噪信号?
  3. VS中怎样对C#项目进行单元测试
  4. xtrabackup对MySQL数据库的备份及恢复教程
  5. LeetCode之Relative Ranks
  6. [蓝桥杯2016决赛]阶乘位数-数论
  7. 年薪50万,他们招180名博士
  8. Windows 7 正在走 XP 系统的老路
  9. JQuery常用方法一览【转】
  10. 常用Feed流架构实现
  11. !DOCTYPE标签的定义与用法
  12. 苹果手机温度测试软件,苹果手机测温神器上线啦!
  13. VMware View 5.0-10–远程图形工作站配置篇
  14. 论文 计算机教育教学能力,高校计算机教师应具备的能力和培养的方向
  15. besiege机器人_围攻besiege机器人 机器人制作思路
  16. Gradle剔除依赖
  17. 学习Python会用到的8个软件,你用的哪些
  18. 占用栅格地图(occupancy grid map)
  19. win10更新至1909版本后,Primo Ramdisk失效的解决方案
  20. 教你怎么从Java8升级到Java11

热门文章

  1. 系统学习机器学习之距离的度量(一)--常见距离
  2. 谈谈市面上无线路由器的性能和芯片
  3. 人生被彻底改变时,我还以为那只是寻常的一天
  4. 腾讯T2大牛亲自教你!5214页PDF的进阶架构师学习笔记,终局之战
  5. 性能工具之 Locust 简单入门
  6. 燕山大学教务系统官网计算机学院,2021年燕山大学教务系统入口:https://jwc.ysu.edu.cn...
  7. 浏览器缓存Cache
  8. 数字大写 php 代码,PHP 中文大写数字 转成 数字代码
  9. 深度学习目标检测 RCNN F-RCNN SPP yolo-v1 v2 v3 残差网络ResNet MobileNet SqueezeNet ShuffleNet
  10. 无绿幕实景抠图、AI抠图