c++ - 优化标准迭代算法

标签 c++ algorithm encryption optimization c-preprocessor

<分区>

引用这里的问题挑战: Link

#include <iostream>

using namespace std;


int main() {
    int T,*x,i,j,k,a,res,pres;
    long Q,N,p,q;
    cin>>T;
    for(k=0;k<T;k++)
    {
        cin>>N>>Q;
        x=new int[N];
        for(i=0;i<N;i++)
        {
            cin>>x[i];
        }
        for(i=0;i<Q;i++)
        {
            pres=-999;
            cin>>a>>p>>q;
            for(j=p-1;j<q;j++)
            {
                res=a xor x[j];
                if(pres<res)
                {
                    pres=res;
                }
            }
            cout<<pres<<endl;

        }
        delete [] x;
    }
    return 0;
}

我在更大的问题 (N=100000)(N、Q、T 最大化)上遇到了超出时间限制(暗示问题可以优化)。我认为我需要使用某种预处理来优化算法。我的解决方案是整个问题的 O(NQT)。该问题将需要针对查询中给定的限制评估所有可能的 XOR。因此,问题需要进行 (q-p)[最多 N] 次查询。我想不出避免这种情况的方法。命中或方向将不胜感激。我正在考虑以某种方式实现一个堆,以便它从堆中扣除查询 a 并创建一个最大堆以查看最大差异和 den xors。但这也需要 O(NQT)

最佳答案

我认为摆弄您所写的内容不会对您的速度有太大影响。您想要时间复杂度更高的东西。

根据这个问题,我假设他们想要每个查询 O(log N) 的东西。我最初的想法是 segment tree , 但我找不到使用它们来最大化 a ^ x[i] 的方法.

我相信您应该使用所有数字都小于 2^15 的事实.另一件需要注意的事情是你想要最大化 xor手术。假设你有(二进制)

a = b_1 b_2 ... b_n

你要么拥有所有x[j]p <= j <= q最高有效位等于 b_1 , 或者有一些 x[j]其中最高有效位是 b_1 的补码.这是因为 b xor ~b = 1对于 b in {0,1} .您只选择那些 j MSB 是 b_1 的补码, 并继续下一位(对应于 b_2 )。

问题是暴力实现这个比你已经在做的更糟糕,但它可能会帮助你更快地实现。

关于c++ - 优化标准迭代算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20716708/

相关文章:

java - 如何使用 AESWRAP 模式包装 RSA key

c++ - CUDA-CUBLAS : issues solving many (3x3) dense linear systems

c++ - 绑定(bind) boost::asio::steady_timer::async_wait

当 base 不在 [2,36] (GCC) 中时,C++11 std::stoi 静默失败

c++ - 为什么这个反向算法不起作用?

java - 我被 alpha-beta 剪枝算法实现所困扰

java - 在游戏中检测触摸物体的有效方法?

c++ - 如何直接将一大块内存读入 std::vector?

java - 应用程序监听器中的 Spring 加载应用程序属性

c - 如何安装 mcrypt 并将 mcrypt.h 添加到我的 C 程序文件中?