zoukankan      html  css  js  c++  java
  • 计蒜客15430 XOR Queries(Trie处理位运算问题)

    题意:

    给出一个长度为n的数组C,回答m个形式为(L, R, A, B)的询问,

    含义为存在多少个不同的数组下标k属于[L, R]满足C[k] XOR A >= B(式中XOR为异或运算)。

    T组测试数据.

    每组第一行为两个整数n, m.(1 <= n, m <= 5e4).

    第二行n个整数表示数组C.(0 <= C[i] <= 1e9).

    接下来m行,第i行四个整数L[i], R[i], A[i], B[i](1 <= L[i] <= R[i] <= n, 0 <= A[i], B[i] <= 1e9.

    对于每次询问,输出一个整数表示满足条件的数组下标数目。

    分析:

    对于一个区间[L,R],求满足C[k] xor A >= B的数目,那么怎么求呢?

    我们可以对这段区间的每个数二进制化,然后从高位开始往低位,去建一个trie树,并计算出每个trie树的节点下面有多少个数,这样就可以通过A在trie树上移动得到最后结果,时间复杂度O(logn)

    那么对于这样变化的区间,容易想到莫队,确实可以

    不过有个更好的想法,就是ans[L,R]=ans[R]-ans[L-1],所以就是求前缀的答案就行了

    也就是每次往trie树中插入一个数,然后去更新该位置有的答案(提前预处理出每个询问对应哪些个位置)

  • 相关阅读:
    NLB网路负载均衡管理器详解
    Nginx配置详解
    Nginx代理功能与负载均衡详解
    .Net使用RabbitMQ详解
    说说面向服务的体系架构SOA
    .Net中的RealProxy实现AOP
    搭建自己的Nuget服务器
    VMware虚拟网络连接模式详解(NAT,Bridged,Host-only)
    JsonUtils
    Linux三剑客
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6883339.html
Copyright © 2011-2022 走看看