【AGC012E】 Camel and Oases ST表+状压dp
题目大意:一排点,两点间有距离。 初始你有一个行走值$v$,如果相邻两点距离不超过$v$你可以自由在这两点行走。
当$v$大于$0$时,你可以选择某一时刻突然飞到任意点,这样做后$v$会减半(下取整)。 问从每个位置初始出发能否到达所有位置。
点的数量$≤2*10^5$,$v≤2*10^5$,$|两点距离|≤10^9$。
我们令$l[i][j]$表示从$i$出发,一路往左走,经过所有长度不超过$v>>j$(此处的$>>$表示右移,以下都是)的边,能走到最左的点的编号。
令$r[i][j]$表示从$i$出发,一路往右走,经过所有长度不超过$v>>j$的边,能走到最右的点的编号。
令$n$表示点的数量,$m=\lceil log_2v\rceil$。
我们不难得出:从$u$号点出发,是否可以遍历完所有点的判断条件,可以转化为:
是否可以将点集分成$m+1$个块,且第$i$(从$0$到$m$)个块内边的长度均不超过$v>>i$,且第$u$号点需要在第$0$个块内。
那么,对于$[1,2^m)$中的每一个$i$($i$是一个二进制状态,$i$的第$j$($j$从$1$到$m$)位为$1$表示选择了图中第$j$个块)
求一个最大的$f[i]$,满足区间$[1,f[i]]$中的点能分成由状态i表示的若干个块。
同理,求一个最小的$g[i]$,满足区间$[g[i],n]$中的点能分成由状态i表示的若干个块。
求这个可以通过l和r的值+状压$dp$实现,时间复杂度是$O(v\ log\ v)$。
我们令$o=2^m-2$。
我们发现,若存在$i$,使得$r[f[i]][0]>=l[g[o$^$i]][0]$,那么从区间$[\ l[g[o$^$i]][0]\ ,\ r[f[i]][0]\ ]$中出发的点,显然可以遍历玩所有点。
我们可以$O(1)$打上一个标记,求答案的时候$O(n)$扫一遍,判断某个点是否被打了标记即可。
总时间复杂度:$O(n\ log\ v+v\ log\ v)$。
#include<bits/stdc++.h>
#define M 400005
#define YXQAK printf("Possible\n")
#define XFZBL printf("Impossible\n");
using namespace std; int a[M]={},n,m,v,l[][M]={},r[][M]={};
int f[M]={},g[M]={},p[M]={}; int main(){
scanf("%d%d",&n,&v);
for(int i=;i<=n;i++) scanf("%d",a+i);
sort(a+,a+n+);
for(int j=,V=v;V;j++,V>>=){
m=max(m,j);
for(int i=;i<=n;i++){
int I=i+;
while(I<=n&&a[I]-a[I-]<=V) I++;
I--;
for(int ii=i;ii<=I;ii++)
l[j][ii]=i,r[j][ii]=I;
i=I;
}
}
m++;
for(int i=;i<=n;i++) l[m][i]=r[m][i]=i;
for(int i=;i<(<<m);i++) g[i]=n; f[]=;
for(int i=;i<(<<m);i++){
int now=;
for(int j=m-;~j;j--)
if((<<j)&i)
f[i]=max(f[i],r[j+][f[i^(<<j)]]+); now=n;
for(int j=m-;~j;j--)
if((<<j)&i)
g[i]=min(g[i],l[j+][g[i^(<<j)]]-);
} for(int i=;i<(<<m);i++){
if(r[][f[i]]+>=l[][g[(<<m)-i-]])
p[l[][g[(<<m)-i-]]]++,p[r[][f[i]]+]--;
}
for(int i=;i<=n;i++){
p[i]+=p[i-];
if(p[i]) YXQAK;
else XFZBL;
}
}
【AGC012E】 Camel and Oases ST表+状压dp的更多相关文章
- UESTC 885 方老师买表 --状压DP
将方格的摆放分成两种: 1.水平摆放:此时所占的两个格子都记为1. 2.竖直摆放:此时底下那个格子记为1,上面那个记为0. 这样的话,每行都会有一个状态表示. 定义:dp[i][s]表示考虑已经填到第 ...
- 【bzoj5161】最长上升子序列 状压dp+打表
题目描述 现在有一个长度为n的随机排列,求它的最长上升子序列长度的期望. 为了避免精度误差,你只需要输出答案模998244353的余数. 输入 输入只包含一个正整数n.N<=28 输出 输出只包 ...
- 洛谷 P4484 - [BJWC2018]最长上升子序列(状压 dp+打表)
洛谷题面传送门 首先看到 LIS 我们可以想到它的 \(\infty\) 种求法(bushi),但是对于此题而言,既然题目出这样一个数据范围,硬要暴搜过去也不太现实,因此我们需想到用某种奇奇怪怪的方式 ...
- [AGC012E]Camel and Oases
题意:有$n$个数轴上的绿洲,给定它们的坐标,有一只骆驼想要访问所有绿洲,当它的驼峰容量为$V$时,它可以走到和当前绿洲距离$\leq V$的绿洲,并可以继续走,它也可以用一次跳跃到达任意一个绿洲,只 ...
- POJ 3254 Corn Fields (状压DP,轮廓线DP)
题意: 有一个n*m的矩阵(0<n,m<=12),有部分的格子可种草,有部分不可种,问有多少种不同的种草方案(完全不种也可以算1种,对答案取模后输出)? 思路: 明显的状压DP啦,只是怎样 ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
$ POJ~1038~~\times Bugs~Integrated~Inc: $ (复杂的状压DP) $ solution: $ 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前 ...
- 【bzoj3195】【 [Jxoi2012]奇怪的道路】另类压缩的状压dp好题
(上不了p站我要死了) 啊啊,其实想清楚了还是挺简单的. Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期 ...
- HDU 6984 - Tree Planting(数据分治+状压 dp)
题面传送门 傻逼卡常屑题/bs/bs,大概现场过得人比较少的原因就是它比较卡常罢(Fog 首先对于这样的题我们很难直接维护,不过注意到这个 \(n=300\) 给得很灵性,\(k\) 比较小和 \(k ...
- 【状压DP】bzoj1087 互不侵犯king
一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...
随机推荐
- Python 的stat 模块
#!/usr/bin/env python#-*- encoding:UTF-8 -*- import os,time,stat fileStats = os.stat ( 'test.txt' ) ...
- 20155213 2016-2017-2 《Java程序设计》第八周学习总结
20155213 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十四章NIO与NIO2 NIO NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你 ...
- MyEclipse配置Maven插件
一.工具环境 1.jdk-7u80-windows-x64 2.apache-tomcat-7.0.70 3.apache-maven-3.3.9 4.MyEclipse 10.7 5.windows ...
- 2018.09.25 51nod1597 有限背包计数问题(背包+前缀和优化)
传送门 dp好题. 我认为原题的描述已经很清楚了: 你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少. 两种方案不同当且仅当存在至少一个数i满足第i种 ...
- TopK排序
利用快速排序实现TopK排序 //返回支点的下标 int partition(int *arr, int low, int high) { //选取第一个元素为支点 int pivot = arr[l ...
- 1024 Hello World
哈哈,原来今天是程序员的节日啊,快乐咯,可是今天好冷好冷~~
- Linux服务器部署系列之三—DNS篇
网上介绍DNS的知识很多,在这里我就不再讲述DNS原理及做名词解释了.本篇我们将以一个实例为例来讲述DNS的配置,实验环境如下: 域名:guoxuemin.cn, 子域:shenzhen.guoxue ...
- Unit Testing of Spring MVC
试验1:做的条目不发现首先,我们必须确保我们的应用是工作性质所做条目不发现.我们可以写的测试以确保通过以下步骤: 1.配置的模拟对象时抛出一个todonotfoundexception findbyi ...
- IntelliJ IDEA 2017版 SpringBoot的web项目补充
一.注解 @SpringBootApplication:Spring Boot项目的核心注解,主要目的是开启自动配置. @Configuration:这是一个配置Sprin ...
- 阿里Sophix热修复
阿里巴巴对Android热修复技术已经进行了长达多年的探索. 最开始,是手淘基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术,Dex ...