@codesonic 正确的方法不应该是令块大小为SSS,然后来分析复杂度吗,大概是O(MS+N2/S)O(MS+N^2/S)O(MS+N2/S),因为每个询问最多移动O(S)O(S)O(S),每个块最多移动O(N)O(N)O(N),所以S=N/MS=N/\sqrt{M}S=N/M最优,此时复杂度为O(NM)O(N\sqrt{M})O(NM); 更精确的算,复杂度应为O(MS+N−S+N−2S+....+N−(N/S)∗S)O(MS+N-S+N-2S+....+N-(N/S)*S)O(MS+N−S+N−2S+....+N−(N/S)∗S) =O(MS+N2/S−(N+S)N/S/2)=O(MS+N^2/S-(N+S)N/S/2)=O(MS+N2/S−(N+S)N/S/2) =O(1/2∗N2/S+MS)=O(1/2*N^2/S+MS)=O(1/2∗N2/S+MS)
所以当MS=1/2∗N2/SMS=1/2*N^2/SMS=1/2∗N2/S的时候,即S=N/M∗2S=N/ \sqrt{M*2}S=N/M∗2时候有最小复杂度(我也不知道算对没)当然块大小是要看情况调整的;带修莫队同理吧