题目链接:洛谷

题目描述:给出$n$个数$a_i$,若$i<j$且$a_i & a_j>0$,则$i$到$j$连一条有向边,$q$次询问,询问从$l$开始是否能到达$r$。

数据范围:$n,q\leq 3*10^5$

一道及其美妙的思维题。(以下均用二进制)

维护两个数组,$g_{i,j}$表示下标小于$i$的数中下标最大且第$j$位为1的下标。$f_{i,j}$表示下标小于$i$的数中下标最大,第$j$位为1且可以到达$i$的下标。

$g_{i,j}$的预处理不用多说了,$f_{i,j}$预处理时可以枚举一位$k$,表示$a_i$通过第$k$位可以从$g_{i,k}$到达,用$g_{i,k}$的f值来直接推出$i$的f值。

询问的时候,枚举一位$i$,表示$r$可以从$f_{r,i}$到达,而当$a_l$的第$i$位为1且$f_{r,i}\geq l$时$l$可以到达$f_{r,i}$,所以$l$可以到达$r$。如果对于每一位都不行则输出fou。

时间复杂度$O(n\log^2n+q\log n)$

 #include<bits/stdc++.h>
#define Rint register int
using namespace std;
const int N = ;
int n, m, f[N][], g[N][];
bool a[N][];
int main(){
scanf("%d%d", &n, &m);
for(Rint i = ;i <= n;i ++){
int x;
scanf("%d", &x);
for(Rint j = ;j < ;j ++)
if(x & ( << j)) a[i][j] = ;
}
for(Rint i = ;i <= n;i ++)
for(Rint j = ;j < ;j ++)
if(a[i - ][j]) g[i][j] = i - ;
else g[i][j] = g[i - ][j];
for(Rint i = ;i <= n;i ++)
for(Rint j = ;j < ;j ++)
for(Rint k = ;k < ;k ++)
if(a[i][k]){
int x = g[i][k];
f[i][j] = max(f[i][j], f[x][j]);
if(a[x][j]) f[i][j] = max(f[i][j], x);
}
while(m --){
int l, r;
bool ans = false;
scanf("%d%d", &l, &r);
for(Rint i = ;i < && !ans;i ++)
if(a[l][i] && f[r][i] >= l) ans = true;
puts(ans ? "Shi" : "Fou");
}
}

CF1168C

CF1168C And Reachability 【构造,dp】的更多相关文章

  1. CF1168C And Reachability(DP)

    首先定义 $g[i][j]$ 表示 $i$ 前面(不包括 $i$)第一个第 $j$ 位是 $1$ 的数的位置.可以随便转移. 再定义 $f[i][j]$ 表示 $i$ 前面(包括 $i$)第一个第 $ ...

  2. 贪心/构造/DP 杂题选做Ⅱ

    由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...

  3. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  4. CROC 2016 - Elimination Round (Rated Unofficial Edition) E. Intellectual Inquiry 贪心 构造 dp

    E. Intellectual Inquiry 题目连接: http://www.codeforces.com/contest/655/problem/E Description After gett ...

  5. 贪心/构造/DP 杂题选做

    本博客将会收录一些贪心/构造的我认为较有价值的题目,这样可以有效的避免日后碰到 P7115 或者 P7915 这样的题就束手无策进而垫底的情况/dk 某些题目虽然跟贪心关系不大,但是在 CF 上有个 ...

  6. At grand 022 GCD序列构造 dp/floyd二进制变换最少费用

    A diverse words指的是每一个字母在单词中出现的次数不超过1的单词 题目要求你求出字典序比当前给定单词大的字典序最小单词 1.如果给定的单词长度小于26 就遍历一次在单词尾部加上字典序最小 ...

  7. hdu1003 1024 Max Sum&Max Sum Plus Plus【基础dp】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4302208.html   ---by 墨染之樱花 dp是竞赛中常见的问题,也是我的弱项orz, ...

  8. uva live 4394 String painter 间隔dp

    // uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...

  9. 洛谷P1140 基因匹配 //DP真正意义上的一血

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务 ...

随机推荐

  1. harbor上传镜像

    在harbor服务器 1. 下载测试上传使用的镜像docker pull hello-world2. 打tagdocker tag docker.io/hello-world:latest 172.1 ...

  2. Session共享问题---理论

    随着网站访问量增加,初期的一台服务器已经完全不能支持业务,这个时候我们就需要增加服务器设备,来抗住请求的增量,如下所示: 负载均衡的目的本来就是要为了平均分配请求,所以没有固定第一次访问和第二次访问的 ...

  3. dg环境连接ORA-00604,ORA-16000: database open for read-only access

    报错信息 根据客户提供的报错信息, ORA-: error occurred at recursive SQL level ORA-: database open for read-only acce ...

  4. 面试经典算法:优先队列,最大堆,堆排序,左偏树Golang实现

    堆排序 使用优先队列-最小/最大堆可实现. 优先队列 优先队列是一种能完成以下任务的队列:插入一个数值,取出最小的数值(获取数值,并且删除).优先队列可以用二叉树来实现,我们称这种为二叉堆. 最小堆 ...

  5. .NET Core 发布部署问题

    运行环境      操作系统                  开发工具      frameworks     .Net Core SDK 版本             托管运行 本地        ...

  6. Android高版本收不到静态注册的广播

    Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-de ...

  7. bash shell的ANSI控制

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如:  echo -e "\033[41;36m something here \03 ...

  8. PHP 根据二维数组中的某个字段进行排序

    <?php $data = array( array( 'id' => 5698, 'first_name' => 'Bill', 'last_name' => 'Gates' ...

  9. test11111111

    test 博文内容中字符过多,拒绝显示 123123123

  10. socket 编程的一些应用例子

    1.#传输文件的例子 import socketfrom socket import *import osimport requests import time,socketserver,struct ...