标签:Venice 技巧 siz ll mt second tag 数据结构
原文链接: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,技巧,siz,ll,mt,second,tag,数据结构 来源: https://www.cnblogs.com/purinliang/p/14401891.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。