洛谷 P4396 [AHOI2013]作业(莫队 + 分块 + 根号均摊)
很显然有一个莫队套树状数组的做法, 因为树状数组更新和查询的复杂度都是 log n \log n lo g n ,复杂度是 n m log n n \sqrt m \log n n m lo g n 通过学习了解到分块数据结构可以做到 O ( 1 ) O(1) O ( 1 ) 查询, O ( n ) O(\sqrt n) O ( n ) 更新 与 O ( n ) O(\sqrt n) O ( n ) 查询, O ( 1 ) O(1) O ( 1 ) 更新的平衡。 由于 查询是 1 0 6 10^6 1 0 6 级别,通过分块数据结构 和 根号平衡在莫队中更新可以做到 O ( 1 ) O(1) O ( 1 ) ,总体复杂度为 O ( m n + n m ) O(m\sqrt n + n \sqrt m) O ( m n + n m ) ,理论上限大约为 3 ∗ 1 0 8 3*10^8 3 ∗ 1 0 8 左右 做法是对权值分块,维护块内数字出现的次数和以及不同数字的个数。 详细见代码: # include <bits/stdc++.h> using namespace std ; const int maxn = 1e6 + 10 ; int n , m , a [ maxn ] , block , cnt [ maxn ] ; int ans [