题意简述
给你一个 [ 1 , n ] [1,n] [1,n]的排列,长度为 n n n,多次查询一段区间中有多少对数满足其中一个是另一个的倍数。 n n n是 1 e 5 1e5 1e5,复杂度大约是 l o g 2 log^2 log2的,当然如果您能想出一个带根号的算法,那我开心死了。私信3348064478@qq.com,或者评论。
思路框架
离线询问,然后用合理的遍历顺序加上一个完美的树状数组维护, n l o g n nlogn nlogn过这个题。
具体思路
我们的主体目标是要在每个数的右边找到一个能与其组成一对倍数关系的数,这样就不会导致同一对倍数被算两次了。所以我们不管是因数关系还是倍数关系,只管往右边就对了。
由于是排列,所以我们珂以用一个 v e c t o r vector vector存储每个数的倍数/因数都出现在哪些位置。这样的空间复杂度是 O ( n / 1 + n / 2 + n / 3 + n / 4... + n / n ) = O ( n l o g n ) O(n/1+n/2+n/3+n/4...+n/n)=O(nlogn) O(n/1+n/2+n/