[CF1168C] And Reachability
And Reachability
题面翻译
题目描述
Toad Pimple 有一个整数数组 。
当 且存在 的数列 满足 时,我们称 是可从 到达的。
其中 表示按位与运算。
现在给出 组下标,请检查它们可否到达。
输入输出格式
输入格式:
第一行,两个整数 ,表示数组的长度和查询的个数。
第二行, 个整数 ,表示给定的数组。
接下来 行中,第 行两个整数 ,表示你需要检查 是否可从 到达。
输出格式:
输出 行。
对于每个询问,如果可到达,输出「Shi」,否则输出「Fou」。
说明
第一个样例中,,与其按位与结果总是 ,所以不可到达。
,所以 可从 到达。
并且从 到达 中,。
题目描述
Toad Pimple has an array of integers .
We say that is reachable from if and there exists an integer array such that , and for all integers such that .
Here denotes the bitwise AND operation.
You are given pairs of indices, check reachability for each of them.
输入格式
The first line contains two integers and ( , ) — the number of integers in the array and the number of queries you need to answer.
The second line contains space-separated integers ( ) — the given array.
The next lines contain two integers each. The -th of them contains two space-separated integers and ( ). You need to check if is reachable from .
输出格式
Output lines. In the -th of them print "Shi" if is reachable from , otherwise, print "Fou".
样例 #1
样例输入 #1
5 3
1 3 0 2 1
1 3
2 4
1 4
样例输出 #1
Fou
Shi
Shi
提示
In the first example, . You can't reach it, because AND with it is always zero. , so is reachable from , and to go from to you can use .
有关位运算,按位考虑。
如果改 的时候出现了某一个 也有的位,那就可以直接跳到 了。
那么定义 为第 个数,要跳到一个拥有第 位的数,最前是跳到哪一个。
然后倒着枚举 ,找到一个这个数跳到拥有第 位的到哪里,然后转移 d 数组。
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int read()
{
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
s=s*10+ch-48,ch=getchar();
return s;
}
int n,q,a[N],mx,nx[20][20],ds[N][20];
int main()
{
// freopen("and.in","r",stdin);
// freopen("and.out","w",stdout);
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=0;i<=18;i++)
for(int j=0;j<=18;j++)
nx[i][j]=n+1;
for(int j=0;j<=18;j++)
ds[n+1][j]=n+1;
for(int i=n;i;i--)
{
for(int j=0;j<=18;j++)
{
if(a[i]>>j&1)
ds[i][j]=i;
else
ds[i][j]=n+1;
}
for(int j=0;j<=18;j++)
for(int k=0;k<=18;k++)
if((a[i]>>j&1)&&(a[i]>>k&1))
nx[j][k]=i;
for(int j=0;j<=18;j++)
{
int mn=n+1;
for(int k=0;k<=18;k++)
if(a[i]>>k&1)
mn=min(mn,nx[j][k]);
for(int k=0;k<=18;k++)
ds[i][k]=min(ds[i][k],ds[mn][k]);
}
// for(int j=0;j<=7;j++)
// printf("%d ",ds[i][j]);
// puts("");
}
while(q--)
{
int fl=0,x=read(),y=read();
for(int i=0;i<=18;i++)
if(ds[x][i]<=y&&(a[y]>>i&1))
fl=1,puts("Shi"),i=18;
if(!fl)
puts("Fou");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-10-17 [牛客22OI提高5D] 愤怒火莲