摘要:
有n个点,标号1到n,给定数组b[i]表示i前面比a[i]小的点的个数,求a[]数组。我们倒着扫b数组,将符合条件的最大的数插入a数组相应的位置,就得解了。但是朴素查找需要很多时间,就需要用数状数组了。维护一个c数组,sum(i)表示现在有几个数字不大于i,因为sum(i)是有序的,所以我们每次查找的时候就用二分查找就行了,在找到这个点以后,就从c数组中删去。总的复杂度为O(n * logn * logn)先开始二分写搓了,改了老半天,唉,二分还是太弱了阿。。2011-10-03 15:07:11RosieYeOrdering the Soldiersaccepted editrun2.544 阅读全文
posted @ 2011-10-03 21:22
ω 提拉米兔 ℃
阅读(402)
评论(0)
推荐(0)
摘要:
理解了很久。。首先分析一维的情况:首先对于每个数A定义集合up(A)表示{A, A+lowestbit(A), A+lowestbit(A)+lowestbit(A+lowestbit(A))...} 定义集合down(A)表示{A, A-lowestbit(A), A-lowestbit(A)-lowestbit(A-lowestbit(A)) ... , 0}。可以发现对于任何A<B,up(A)和down(B)的交集有且仅有一个数。这样,在改变区间[a,b]时,我们只用更改down(b)和down(a-1)的值,用数状数组实现。在求点i的状态的时候就直接求up(i).因为之前所说的性 阅读全文
posted @ 2011-10-03 17:21
ω 提拉米兔 ℃
阅读(265)
评论(0)
推荐(0)
浙公网安备 33010602011771号