【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 ...
随机推荐
- DB2 create into的用法
. 建立表 create table zjt_tables as (select * from tables) definition only; create table zjt_views as ( ...
- devart 放大招了
前面我纪念BDE 的文章里面说过,devart 会在今后在数据库存取技术上会有更大的 进步,没想到很快devart 放大招了.在最新的unidac 和sdac 中,devart 支持在非Windows ...
- java实现从url路径中下载pdf文档到本地
package com.cellstrain.icell.util; import java.io.*;import java.net.*; public class DownloadPdf { /* ...
- IntelliJ IDEA 2017版 spring-boot 报错Consider defining a bean of type 'xxx' in your configuration问题解决方案
问题分析: 通过问题的英文可知,这个错误是service的bean注入失败,那么为什么会产生这个问题呢? 主要是框架的Application产生的,所以我们建立项目的时候,要保证项目中的类跟Appli ...
- 百度上传插件 WebUploader初始使用
引入资源 使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF. <!--引入CSS--> <link rel="stylesheet" ...
- Go并发编程基础(译)
2015-05-20 三 By youngsterxyf 原文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入 ...
- (二进制 异或)Team Formation --ZOJ --3870
链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3870 http://acm.hust.edu.cn/vjudge/ ...
- Android学习整理之Activity篇
一.Activity概念介绍 activity属于android的四大组件之一(其他的三个: Content provider,Broadcast receiver,Service),它可以理解为一个 ...
- java实现WC项目
个人项目:WC wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单 ...
- Grafana安装及配置
安装 sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-2.1.3-1.x86_64.rpm 启动 sudo se ...