我们有两个 N 位数(0< N< 100000)。我们必须对这些数字执行 q 次查询(0< q<500000)。查询可以有以下三种类型:
set_a idx x:将 A[idx] 设置为 x,其中 0 <= idx < N,其中 A[idx] 是 A 的第 idx 个最低有效位。
set_b idx x:将 B[idx] 设置为 x,其中 0 <= idx < N。
get_c idx:打印C[idx],其中C=A+B,0<=idx
现在,我已尽我所能优化代码。
首先,我尝试为 a、b 和 c 使用一个 int 数组。对于每次更新,我计算 c 并在查询时返回第 i 位。这该死的慢。仅清除 4/11 测试用例。
我转而使用布尔数组。它比 int 数组方法快大约 2 倍。清除 7/11 测试用例。
接下来,我发现我不需要计算 c 来计算 A+B 的第 idx 位。我将从 idx 向右扫描 A 和 B,直到找到 a[i]=b[i]=0 或 a[i]=b[i]=1。如果 a[i]=b[i]=0,那么我只需从初始进位 =0 开始向左加到第 idx 位。如果 a[i]=b[i]=1,那么我只需从初始进位 =1 开始向左加到第 idx 位。这更快,但只清除了 8/11 测试用例。
然后,我想通了一次,我到达位置 i,a[i]=b[i]=0 或 a[i]=b[i]=1,然后我不需要加到第 idx 个位置。如果a[i]=b[i]=0,那么答案是(a[idx]+b[idx])%2,如果a[i]=b[i]=1,那么答案是(a[ idx]+b[idx]+1)%2。它快了大约 40%,但仍然只清除了 8/11 的测试用例。
现在我的问题是如何处理这 3 个“硬”测试用例?我不知道它们是什么,但程序需要> 3 秒才能解决问题。
这是代码:http: //ideone.com/LopZf