AtCoder Grand Contest 012 E Camel and Oases 状压dp
Description
有一个容量为V的包,n个接水点,坐标分别为x[]
有两种移动方式:
- 若两个接水点之间的距离不超过此时包的容量v,那么就可以移动
- 若此时v不等于0,那么可以使v=v/2(下取整),然后跳到任意一个位置
对于每一个接水处作为出发点,分别回答能否到达所有其余接水点
n,V≤105n,V\le 10^5n,V≤105
∀i≤n,  xi≤109\forall i\le n,\; x_i\le10^9∀i≤n,xi≤109
Solution
操作2最多只有logV次,而同一个v能走到的位置是若干不相交的线段
问题变成:我们在V最大的时候强制选一个线段,每一个v最多选一个线段,问能否选出一个线段的集合覆盖整个数轴
考虑状压dp,设f[x]表示选择v状态为x的时候,从1起能覆盖到的最右边,g[x]表示从n起能覆盖到的最左边,当f[x]和g[x]在某一个V的线段内部时就是可行的
一个小trick就是记录left[j]表示j往右最多到哪里,这样转移就非常方便了。最后统计答案的时候要注意一下,一开始写萎T掉了
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define fill(x,t) memset(x,t,sizeof(x))const int N=400005;int f[N],g[N],p[N],L[N],R[N],ans[N];
int left[25][N],righ[25][N],bel[N];
int n,V,tot;int read() {int x=0,v=1; char ch=getchar();for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());return x*v;
}void pre(int v,int id) {for (int i=1,j;i<=n;i=j+1) {for (j=i;j<n&&p[j+1]-p[j]<=v;) j++;rep(k,i,j) left[id][i]=j,righ[id][j]=i;}
}void solve() {for (int i=0,lim=(1<<tot);i<lim;++i) {g[i]=n+1;}for (int i=0,lim=(1<<tot);i<lim;++i) {rep(j,0,tot-1) if ((i>>j)&1) {f[i]=std:: max(f[i],left[j][f[i-(1<<j)]+1]);g[i]=std:: min(g[i],righ[j][g[i-(1<<j)]-1]);}}for (int i=0,lim=(1<<tot);i<lim;++i) {int j=lim-i-1;if (f[i]+1>=L[bel[f[i]+1]]&&g[j]-1<=R[bel[f[i]+1]]) {ans[bel[f[i]+1]]=1;}}
}int main(void) {fill(righ,63);n=read(),V=read();rep(i,1,n) p[i]=read();for (int v=V/2;;v>>=1) {pre(v,tot++);if (!v) break;}for (int i=1,j;i<=n;i=j+1) {bel[i]=++bel[0];for (j=i;j<n&&p[j+1]-p[j]<=V;) bel[++j]=bel[0];L[bel[0]]=i,R[bel[0]]=j;}solve();rep(i,1,n) if (ans[bel[i]]) puts("Possible");else puts("Impossible");return 0;
}
AtCoder Grand Contest 012 E Camel and Oases 状压dp相关推荐
- AtCoder Grand Contest 012 E - Camel and Oases 状压dp
题意 平面上有n个点.初始有V的权值,每次可以从一个点走到与他距离不超过V的点,当V>0时也可以让V/2且到达任意一个点.问从每个点出发能否遍历所有点. n,V<=200000 分析 显然 ...
- AGC 012 E Camel and Oases - 状压dp
题目大意:数轴上有n个不同的点,你有一个能量,初始是v.可以进行两种操作,走到左边/右边一个点,如果当前能量大于等于距离.或者随意跳到一个点,但是要求能量不是0并且能量要减半(向下取整).对每个点求从 ...
- Atcoder Grand Contest 012 B - Splatter Painting解题报告
题目:http://agc012.contest.atcoder.jp/tasks/agc012_b 有一个n点m边的图,(不一定联通) 还有q个操作:每次将一个点v及其周围距离<=d的点涂成颜 ...
- AtCoder Grand Contest 012 B Splatter Painting (反向处理 + 记忆化)
题目链接 agc012 Problem B 题意 给定一个$n$个点$m$条边的无向图,现在有$q$个操作.对距离$v$不超过$d$的所有点染色,颜色编号为$c$. 求每个点最后的颜色状态. 倒过 ...
- AtCoder Grand Contest 012 B Splatter Painting(记忆化搜索)
题意: 给一个包含N个顶点,M条边,无自环和重边的简单无向图,初始每个点颜色都为0,每条边的长度为1,连接着ai,bi两个节点.经过若干个操作, 每次将与某个点vi距离不超过di的所有点染成某种颜色c ...
- 【每日亿题#12】AtCoder Grand Contest 021 (A ~ F)全部题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 AtCoder Grand Contest 021 题解 A. Digit Sum 2 B. ...
- AtCoder Grand Contest 008: Contiguous Repainting(思维)
Contiguous Repainting 时间限制: 2 Sec 内存限制: 256 MB 提交: 69 解决: 22 [提交][状态][讨论版][命题人:admin] 题目描述 There a ...
- AtCoder Grand Contest 017
AtCoder Grand Contest 017 A - Biscuits 有\(n\)个数,问有多少个集合的数的和模\(2\)余\(P\). 随便\(dp\)一下就好了. #include< ...
- AtCoder题解——AtCoder Grand Contest 048——A - atcoder < S
题目相关 题目链接 AtCoder Grand Contest 048 A 题,https://atcoder.jp/contests/agc048/tasks/agc048_a. Problem S ...
最新文章
- aosp 本地版本管理_本地代码版本管理
- VMware-使用VMware在本地搭建多个CentOS虚机
- 算法练习day11——190329(平衡二叉树、搜索二叉树、完全二叉树)
- netty依赖_高性能:《一遍文章带你看懂 Netty世界》
- go语言csv文件的读取与写入
- typeof instanceof
- asp.net 使用my97 datepicker实现前后两个日期的范围界定
- 精雕道路怎么遍弧形_【养护技术】道路“创可贴”——沥青冷补料 六大优势助力道路养护...
- 决策树 prepruning_智能建筑运维前探 AI天天见之五:决策树算法应用探索
- Data - 信息获取途径汇总
- POI导入数据的过程中,遇到读取以科学计数法显示的数据
- mysql只update不做修改_105岁老人抽烟喝酒不运动,长寿秘诀:只做4件事,不做1件事...
- Android与物联网设备通信-网络模型分层
- Tab,回车/换行组合符
- linux下抓取网页快照
- 真实可行的Python清屏命令
- android获取wifi支持的信道,Android获取当前联接wifi的信道
- Word最常用的100个通用快捷键
- 图片放大不模糊,如何实现?
- 外贸收款——国际主流收款方式
热门文章
- 晋拓股份上交所上市:市值26亿 张东家族企业色彩浓厚
- SQL SERVER 服务器名称的更改
- 什么是概念模型?概念模型的作用是什么?
- VPCS使用教程:模拟GNS3虚拟PC
- 蓝牙BLE芯片PHY6222之I2C主从通信
- webpack5打包图片报错——Module parse failed: Octal literal in strict mode 图片不能正常显示
- 我的世界服务器神秘修改节点,我的世界如何用NBT指令方块修改神秘时代4
- 荆楚理工学院计算机科学专业,2017荆楚理工学院专业排名
- Windows 7 SP1补丁包 (32位) V 2013.10 官方版
- 理解卷积的空间不变性和通道特异性