题目大意:一排点,两点间有距离。 初始你有一个行走值$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)$。

 1 #include<bits/stdc++.h>
 2 #define M 400005
 3 #define YXQAK printf("Possible\n")
 4 #define XFZBL printf("Impossible\n");
 5 using namespace std;
 6
 7 int a[M]={0},n,m,v,l[20][M]={0},r[20][M]={0};
 8 int f[M]={0},g[M]={0},p[M]={0};
 9
10 int main(){
11     scanf("%d%d",&n,&v);
12     for(int i=1;i<=n;i++) scanf("%d",a+i);
13     sort(a+1,a+n+1);
14     for(int j=0,V=v;V;j++,V>>=1){
15         m=max(m,j);
16         for(int i=1;i<=n;i++){
17             int I=i+1;
18             while(I<=n&&a[I]-a[I-1]<=V) I++;
19             I--;
20             for(int ii=i;ii<=I;ii++)
21             l[j][ii]=i,r[j][ii]=I;
22             i=I;
23         }
24     }
25     m++;
26     for(int i=1;i<=n;i++) l[m][i]=r[m][i]=i;
27     for(int i=0;i<(1<<m);i++) g[i]=n; f[0]=1;
28     for(int i=1;i<(1<<m);i++){
29         int now=1;
30         for(int j=m-1;~j;j--)
31         if((1<<j)&i)
32         f[i]=max(f[i],r[j+1][f[i^(1<<j)]]+1);
33
34         now=n;
35         for(int j=m-1;~j;j--)
36         if((1<<j)&i)
37         g[i]=min(g[i],l[j+1][g[i^(1<<j)]]-1);
38     }
39
40     for(int i=0;i<(1<<m);i++){
41         if(r[0][f[i]]+1>=l[0][g[(1<<m)-i-1]])
42         p[l[0][g[(1<<m)-i-1]]]++,p[r[0][f[i]]+1]--;
43     }
44     for(int i=1;i<=n;i++){
45         p[i]+=p[i-1];
46         if(p[i]) YXQAK;
47         else XFZBL;
48     }
49 }

转载于:https://www.cnblogs.com/xiefengze1/p/9806354.html

【AGC012E】 Camel and Oases ST表+状压dp相关推荐

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

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

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

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

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

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

  4. [agc012e]Camel and Oases

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

  5. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  6. poj3254/洛谷P1896 状压dp

    http://poj.org/problem?id=3254 https://www.luogu.org/problemnew/show/P1896 把这两题放在一起,解题思路差不多.以POJ的为例 ...

  7. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  8. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...

  9. [学习笔记]状压dp

    状压 \(dp\) 1.[SDOI2009]Bill的挑战 \(f[i][j]\) 表示匹配到字符串的第 \(i\) 位状态为 \(j\) 的方案数 那么方程就很明显了,每次枚举第 \(i\) 位的字 ...

最新文章

  1. 代码写的烂,经常被同事怼,教你一招!
  2. 梯度下降原理及Python实现
  3. pytorch多标签分类交叉熵loss
  4. 别吵吵内卷了,看看人家虚拟人:连续直播70天都没工资
  5. XCTF-高手进阶区:web2
  6. 为什么手机最后 10% 的电量很不耐,最后1%的电量最耐用?
  7. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等
  8. 使用Express和MongoDB构建CRUD应用程序-第2部分
  9. 获取某一数据库的所有存储过程的名字
  10. Atitit.ide技术原理与实践attilax总结
  11. vgextend 扩容卷组,即把物理卷加入卷组
  12. 阿里UX矢量图标库–最强大的矢量图标库(Icon font制作力荐工具)
  13. 如何向VISUAL SVN SERVER上传文件
  14. 关务+物流领域的技术发展路线
  15. Excel 2010 SQL应用066 返回数字与文本混杂的数据
  16. 微信小程序 修改radio样式
  17. 出入库管理系统1(配件报表-后录编号)
  18. Deep Attention Network:基于深层注意力网络的高光谱与多光谱图像融合
  19. 狂神redis笔记_狂神说redis笔记(三)
  20. 微信小程序运营系列(三)——小程序八大运营功能及技巧

热门文章

  1. dsp31段最佳调音图_31段均衡器调整方法详解,音响调音师必备!
  2. 喝一碗孟婆汤nbsp;走一遍奈何桥
  3. 喝一碗孟婆汤,走一回奈何桥(FLASH转载)
  4. java嵌套循环_java基础之嵌套循环
  5. 陌上人如玉,公子世无双
  6. android studio json格式化,Android json格式化显示,可展开与折叠
  7. 流媒体技术在宽带网络的应用与发展
  8. SASRec: Self-Attentive Sequential Recommendation阅读笔记
  9. 移动网络运营商显示无服务器,无线路由器忽然拨不上号,显示网络运营商远端无响应怎么处理...
  10. SAP_ABAP_BADI AND NEW BADI