这道题假设依照表达式一个个来算肯定超时,下午时候想了一个O(nlogn*logn)的算法。可是t了。由于这道题卡的很紧几百个例子,必须nlogn的算法才干够ac
回到这道题,考虑log(sum(i,j))+1的特点,能够发现它的值域范围很小。在1-34之间。那么我们能够考虑枚举log(sum(i,j)+1的值。记为k,然后统计(i+j)的和就可以。
对于每个k,找到全部满足2^(k-1)<=sum(i,j)<=2^k-1的(i+j),
那么我们考虑每一个前缀i,找到这个前缀满足2^(k-1)<=sum(i,j)<=2^k-1的区间[l,r],即对于这个区间的每一个元素s(i,j),都满足上式(l<=j<=r)。
这一步枚举有一个小技巧,当我们找到前缀i的区间[l,r]之后。那么前缀i+1满足上式的区间一定不可能在前缀i的[l, r]之前。
那么我们用两个指针维护这个区间就可以,那么时间复杂度就降为了O(n*logn).
ps:下午写的n*logn*logn的代码在我电脑上跑了22000ms,ac代码在我电脑上跑了5500ms,ac代码在oj上跑了1600ms。
![](https://img-blog.csdn.net/20150807030842592?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
#include #include #include #include #include #include #include #include