码迷,mamicode.com
首页 > 其他好文 > 详细

【数据结构】Venice技巧

时间:2021-02-17 14:31:46      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:find   ras   nic   arc   codeforce   查询   entry   target   ==   

原文链接:https://codeforces.com/blog/entry/58316

更多数据结构技巧:https://codeforces.com/search?query=%23data+structure

维护一个类似mutiset的数据结构,支持以下操作:

1、向数据结构中添加c个元素x。
2、从数据结构中删除至多c个元素x。
3、查询数据结构中的元素数量
4、查询数据结构中某个元素x的个数c
5、把数据结构中的每个元素x改为元素x+k

这个操作5是比较复杂的,对此要维护一个全局的tag。然后发现它其实除了支持加法也支持异或,事实上它支持任意一个半群。

struct VeniceTechnique {

    typedef map<ll, int> mt;

    mt M;
    ll siz, tag;

    void Init() {
        M.clear();
        siz = 0, tag = 0;
    }

    void Insert(ll x, int c = 1) {
        x += tag;
        siz += c;
        M[x] += c;
    }

    void Remove(ll x, int c = 1) {
        x += tag;
        mt::iterator it = M.find(x);
        if(it == M.end())
            return;
        if(it->second <= c) {
            siz -= it->second;
            M.erase(it);
        } else {
            siz -= c;
            it->second -= c;
        }
    }

    void UpdateAll(ll k) {
        tag += k;
    }

    int Count(ll x) {
        x += tag;
        mt::iterator it = M.find(x);
        if(it == M.end())
            return 0;
        return it->second;
    }

    ll Size() {
        return siz;
    }

} vt;

【数据结构】Venice技巧

标签:find   ras   nic   arc   codeforce   查询   entry   target   ==   

原文地址:https://www.cnblogs.com/purinliang/p/14401891.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!