【问题标题】:summation of XOR of X with each of the array element from range L to R bothX 与从 L 到 R 范围内的每个数组元素的 XOR 的总和
【发布时间】:2019-04-20 06:50:43
【问题描述】:

我试图在hackerearth 中解决这个问题i demand a trial by combat,我主要解决了但我在3 之后在测试用例中得到了TLE 我的解决方案需要时间复杂度

O(Q*R+L-1) 这意味着 O(N^2) 有没有办法解决这个问题 在 O(N) 或更短的时间内 这是我的解决方案

#include <stdio.h>
#include <stdlib.h>
#define ll long long 

int main(){

ll q,x,n,r,l;

scanf("%lld %lld",&n,&q);

ll arr[n];

for(ll i=0; i<n; i++){

    scanf("%lld",&arr[i]);
}

while(q--){

    scanf("%lld %lld %lld",&l,&r,&x);

    ll sum = 0;

    for(ll i=l-1; i<r; i++){

        sum += arr[i]^x;
    }

    printf("%lld\n",sum);
}
}

问题:

给定一个大小为 N 的整数 A 数组。现在给定 Q 查询以在该数组上执行。

在每个查询中,给定 3 个空格分隔的整数 L、R 和 X,您需要输出 X 与从 L 到 R 范围内的每个数组元素的 XOR 总和(基于 1 的索引) )。

sum (i=l to r) of A[i] XOR X     In simple terms

约束:

1

1

1

1

【问题讨论】:

    标签: c algorithm performance bit-manipulation bitwise-operators


    【解决方案1】:

    我们可以将每个位的频率存储在其自己的前缀数组中。对于 X 中的每个设置位,我们有与该范围内的零位一样多的位。对于 X 中的每个未设置位,我们有与该范围内的一样多的位。

    例如:

    A = [3, 4]
    
    // Frequency prefixes of each bit
    ps[0] = [1, 1]
    ps[1] = [1, 1]
    ps[2] = [0, 1]
    
    X = 5, L = 1, R = 2
    
    bit 0 is set in X so we add one 1
      (for the unset bit 0 in 4)
    
    bit 1 is unset in X so we add one 1
      (for the set bit 1 in 3)
    
    bit 2 is set in X so we add one 1
      (for the unset bit in 3)
    
    1*1 + 1*2 + 1*4 = 7
    

    对于每个查询,我们可以使用我们的位频率前缀数组获得 O(1) 范围内每个位的个数。然后我们需要对 30 个乘法求和。总共 30 * 10^5 个查询,即 O(Q)。

    【讨论】:

    • 我对 Frequency prefixes of each bit 部分感到困惑。你能再解释一下吗?
    • @JohnKoch 它通常被称为“前缀和”。仅查看 [1,2,3,4] 中每个数字的第一位,我们有 [1,0,1,0](第一位设置为 1,未设置为 2,等等)。在这种情况下,前缀总和与我所说的“频率前缀”相同:ps = [1,1,2,2]。假设我们想知道索引 (2,3) 之间有多少个 1。我们可以通过减去 ps[3] - ps[1] = 2 - 1 = 1 来计算。仅针对索引 (3):ps[3] - ps[2] = 2 - 2 = 0。有意义吗?
    • גלעד ברקן@ 我明白了。 [1, 1, 2, 2] 是 [1, 0, 1, 0] 的partial sum。与主题无关,但有趣的是,当我尝试@你的名字时,@ 符号会自动转到右侧。这是我@希伯来名字的第一个名字。
    • @JohnKoch 嘿,我不知道它会翻转对齐方式。酷。
    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2020-02-18
    相关资源
    最近更新 更多