(A[i]^x)>(A[i]&x) 的时间复杂度
time complexity of (A[i]^x)>(A[i]&x)
'Is it possible to further optimize the time complexity this piece of calculation "(y^x)>(y&x)" in c++?(you are allowed to change the Boolean operation into other forms, for example this can also be written as log2(y)!=log2(x) and this gives the same Boolean output but this has a higher time complexity with c++ compiler)'enter code here
#include <bits/stdc++.h>
using namespace std;
int main() {
// your code goes here
int t;cin>>t;
while(t--){
int n;cin>>n;int A[n];
for(int i=0;i<n;i++){cin>>A[i];}
int q;cin>>q;
while(q--){
int l,r,x;
cin>>l>>r>>x;int count=0;
for(int i=l-1;i<r;i++){
if((A[i]^x)>(A[i]&x)){count++;}
}
cout<<count<<endl;
}
}
return 0;
}
'This is the code im trying to optimize.... Please help in any way possible (number of inputs cant be changed)'
(y^x)>(y&x)
等同于 nlz(y) != nlz(x)
,其中 nlz
是一个函数,returns 其输入的前导零数。
因此,为了计算数组 A
中的项目 (A[i]^x)>(A[i]&x)
成立的频率,我们可以创建一个小数组 N
,其中 N[j]
是数字数组 A
中具有 nlz(A[i]) == j
的元素数。那么(A[i]^x)>(A[i]&x)
为真的次数就相当于n - N[nlz(x)]
.
这样就不会在 A
真正重要的地方循环。创建数组 N
仍然需要在 A
上循环,但外循环的每次迭代只需要一次,而不是每个单独的 x
.
C++20 在名称 std::countl_zero
.
下内置了 nlz
函数
'Is it possible to further optimize the time complexity this piece of calculation "(y^x)>(y&x)" in c++?(you are allowed to change the Boolean operation into other forms, for example this can also be written as log2(y)!=log2(x) and this gives the same Boolean output but this has a higher time complexity with c++ compiler)'enter code here
#include <bits/stdc++.h>
using namespace std;
int main() {
// your code goes here
int t;cin>>t;
while(t--){
int n;cin>>n;int A[n];
for(int i=0;i<n;i++){cin>>A[i];}
int q;cin>>q;
while(q--){
int l,r,x;
cin>>l>>r>>x;int count=0;
for(int i=l-1;i<r;i++){
if((A[i]^x)>(A[i]&x)){count++;}
}
cout<<count<<endl;
}
}
return 0;
}
'This is the code im trying to optimize.... Please help in any way possible (number of inputs cant be changed)'
(y^x)>(y&x)
等同于 nlz(y) != nlz(x)
,其中 nlz
是一个函数,returns 其输入的前导零数。
因此,为了计算数组 A
中的项目 (A[i]^x)>(A[i]&x)
成立的频率,我们可以创建一个小数组 N
,其中 N[j]
是数字数组 A
中具有 nlz(A[i]) == j
的元素数。那么(A[i]^x)>(A[i]&x)
为真的次数就相当于n - N[nlz(x)]
.
这样就不会在 A
真正重要的地方循环。创建数组 N
仍然需要在 A
上循环,但外循环的每次迭代只需要一次,而不是每个单独的 x
.
C++20 在名称 std::countl_zero
.
nlz
函数