区间逆序对
例题
P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II - 洛谷
根据区间逆序对的性质, 将莫队再次离线即二次离线莫队.
代码
| C++ | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | |
P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I - 洛谷
分块
如果 \(L\) 和 \(R\) 在同一个块内, 可以对每一块单独排序, 按值从大到小遍历, 将下标在区间 \(L,R\) 和 \(<L\) 拿出来分别讨论即可计算出区间 \([L,R]\) 的逆序对数量.
如果 \(L\) 和 \(R\) 不在同一个块内, 那么我们可以拆成整块与整块之间的逆序对, 左散块与整块之间的逆序对, 右散块与整块之间的逆序对, 左散块与右散块之间的逆序对.
对于整块与整块之间的逆序对, 我们可以先预处理出第 \(1\) 块到第 \(i\) 块 \(<j\) 的数的数量, 即 \(f_{i,j}\).
令 \(s_{i,j}\) 为第 \(i\) 块到第 \(j\) 块之间的逆序对数量, 则 \(s_{i,j}=s_{i,j-1}+\sum_{k=st_j}^{ed_j}((f_{j-1,n}-f_{i-1,n})-(f_{j-1,a_k}-f_{i-1,a_k}))\)
对于 \(f_{i,j}\), 我们刚开始先枚举 \(a_k\), 使 \(f_{belong_k,a_k}\) 自增 \(1\).
然后我们前缀 \(i\), 即对任意的 \(j\) 都 \(f_{i,j}+=f_{i-1,j}\)
然后我们再前缀 \(j\), 即对任意的 \(i\) 都 \(f_{i,j}+=f_{i,j-1}\)
对于左散块与右散块之间的逆序对, 我们可以把左侧和右侧的数分别升序存入两个队列, 然后使用归并的思想线性求逆序对.
对于左散块与整块之间的逆序对, 我们可以枚举左散块的 \(a_k\), 通过 \(\sum(f_{belong_k,a_k-1}-f_{i,a_k-1})\) 求出.
对于右散块与整块之间的逆序对, 我们可以枚举右散块的 \(a_k\), 通过 \(\sum((f_{belong_k,n}-f_{i,n})-(f_{belong_k,a_k}-f_{i,a_k}))\) 求出.
代码
| C++ | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | |