第
使用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