基本信息
文件名称:使用C++,将以下内容翻译为中文:在给定数组的索引范围内进行按位与的查询.docx
文件大小:16.88 KB
总页数:4 页
更新时间:2025-05-20
总字数:约2.64千字
文档摘要

使用C++,将以下内容翻译为中文:在给定数组的索引范围内进行按位与的查询

在本文中,我们给出了一个问题,其中给定一个整数数组,我们的任务是找到给定范围的按位与,例如7minus;

Input:arr[]={1,3,1,2,32,3,3,4,4},q[]={{0,1},{3,5}}

Output:

1AND31=1

23AND34AND4=00

Input:arr[]={1,2,3,4,510,10,12,16,8},q[]={{0,42},{1,33,4}}

Output:

0

我们将首先应用暴力方法并检查其时间复杂度。如果我们的时间复杂度不够好,我们会尝试开发更好的方法。

在给定的方法中,我们将遍历给定的范围并找到我们的方法回答并打印。

#includebits/stdc++.h

usingnamespacestd;

intmAIn(){

intARR[]={10,10,12,16,8};

intn=sizeof(ARR)/sizeof(int);//sizeofourarray

intqueries[][2]={{0,2},{3,4}};//givenqueries

intq=sizeof(queries)/sizeof(queries[0]);//numberofqueries

for(inti=0;ii++){//traversingthroughallthequeries

longans=1LL32;

ans-=1;//makingallthebitsofans1

for(intj=queries[i][0];j=queries[i][1];j++)//traversingthroughtherange

ans=ARR[j];//calculatingtheanswer

coutans\n

return0;

}

0

在这种方法中,我们对每个查询的范围运行一个循环,并按位打印它们的集合,因此我们程序的整体复杂性变为O(N*Q),其中N是数组的大小,Q是我们现在的查询数量,您可以看到这种复杂性不适合更高的约束,因此我们将针对此问题提出更快的方法。

在这个问题中,我们预先计算数组的前缀位数,通过检查给定范围内设置位的贡献来计算给定范围的按位与。

#includebits/stdc++.h

usingnamespacestd;

#definebitt32

#defineMAX(int)10e5

intprefixbits[bitt][MAX];

voidbitcount(int*ARR,intn){//makingprefixcounts

for(intj=31;jj--){

prefixbits[j][0]=((ARR[0]j)1);

for(inti=1;ii++){

prefixbits[j][i]=ARR[i](1LLj);

prefixbits[j][i]+=prefixbits[j][i-1];

return;

intcheck(intl,intr){//calculatingtheanswer

longans=0;//toavoidoverflowwearetakingansaslong

for(inti=0;ii++){

intx;

if(l==0)

x=prefixbits[i][r];

else

x=prefixbits[i][r]-prefixbits[i][l-1];

if(x==r-l+1)

ans=ans|1LLi;

returnans;

intmain(){

intARR[]={10,10,12,16,8};

intn=sizeof(ARR)/sizeof(int);//sizeofourarray

memset(prefixbits,0,sizeof(prefixbits));//initializingalltheelements