【发布时间】:2013-12-21 07:32:50
【问题描述】:
关于这里的问题挑战: 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)[Can be at max N] 次查询。我想不出办法避免这种情况。一个命中或一个方向将不胜感激。我正在考虑以某种方式实现一个堆,以便它从堆中扣除查询 a 并创建一个最大堆以查看最大差异和 den xor。但这也需要 O(NQT)
【问题讨论】:
-
为什么你的循环从 1 开始?为什么分配而不解除分配?为什么要在远离使用点的地方声明变量?你为什么
using namespace std;?先清理代码,得到巨大的常数因子。 -
清理了Itsy Bitsy Things。我的主要代码已全部清理。在我清理不必要的东西之前,这有点生硬。从 1 开始,因为最初没有得到结果,只是为了确保从 1 到 N 的所有内容,所以 dat 按照我认为的算法进行。
-
可能更适合 codereview.stackexchange.com
-
@Yakk,我认为您对
using namespace std;有点苛刻,这不在标头中,因此对于大多数代码来说它是常见且完全可以接受的 -
我相信这里也有人问过同样的问题。 stackoverflow.com/questions/9395549/…
标签: c++ algorithm encryption optimization c-preprocessor