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序

https://blog.csdn.net/u012061345/article/details/54093879

树上带修莫队

posted @ 2020-07-13 20:39  naymi  阅读(62)  评论(0)    收藏  举报