2020.7.11 --莫队算法(待补)
参考 https://blog.csdn.net/u012061345/article/details/53995493
普通莫队
const ll maxn = 1e6 + 7;
struct quarry
{
ll id, l, r;
} q[maxn];
ll siz, n, m;
ll a[maxn], ans[maxn], res, a_[maxn];
ll nowr, nowl, id;
map<ll, ll> mp;
ll mmp[maxn];
void init()
{
mem(a, 0), mem(ans, 0), mem(q, 0), mem(mmp, 0);
mp.clear();
nowl = 0, nowr = 0, id = 0, siz = sqrt(n), res = 0;
}
bool cmp(quarry a, quarry b)
{
return a.l / siz == b.l / siz ? a.r < b.r : a.l / siz < b.l / siz;
}
void add(ll pos)
{
if (mmp[a_[pos]] == 0)
res += a[pos];
mmp[a_[pos]]++;
}
void del(ll pos)
{
if (mmp[a_[pos]] == 1)
res -= a[pos];
mmp[a_[pos]]--;
}
int main()
{
ioss;
cin >> n;
while (cin >> n)
{
init();
for (ll i = 1; i <= n; i++)
{
cin >> a[i];
if (mp[a[i]] == 0)
mp[a[i]] = ++id;
a_[i] = mp[a[i]];
}
cin >> m;
for (ll i = 1; i <= m; i++)
{
cin >> q[i].l >> q[i].r;
q[i].id = i;
}
sort(q + 1, q + m + 1, cmp);
for (ll i = 1; i <= m; i++)
{
while (nowr < q[i].r)
add(++nowr);
while (nowl > q[i].l)
add(--nowl);
while (nowr > q[i].r)
del(nowr--);
while (nowl < q[i].l)
del(nowl++);
ans[q[i].id] = res;
}
for (ll i = 1; i <= m; i++)
cout << ans[i] << endl;
}
}
带修莫队
树上莫队
前置技能: 树的dfs序
树上带修莫队
我看见 你