multiset初步使用
学会使用multiset!
可重集和,本质上是一个红黑树。
基本操作
定义:
multiset<int>a;
定义一个迭代器:
multiset<int> :: iterator it;
插入:
a.insert(x);
multiset内部自动排序,关键字相同的按照插入顺序从前往后排。
返回首尾迭代器:
a.begin();
a.end();
真实值的话就加一个 *, 如:
cout << *a.begin() << endl;
查询集合内一个值出现的位置,返回一个迭代器,如果目标值不存在,返回尾指针之后的位置:
a.find(x);
删除,如果删除函数的参数填的是一个集合内的类型值,则可重集内的全部元素将被删除。若想要同一个值只删除一个元素,需要往参数里填此元素所在的迭代器。
a.erase(x);
a.erase(a.find(x));
遍历:
multiset<int> :: iterator it = a.begin();
for(;;it++){
printf("%d", *it);
if(it == a.end()) break;
}
下面让我们来练习一下吧!
P1110 [ZJOI2007]报表统计
代码:
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<iostream>
#include<algorithm>
#include<functional>
#define inf 0x3fffffff
using namespace std;
typedef long long ll;
#ifndef DONLINE_JUDGE
char xch, xB[1 << 15], *xS = xB, *xTT = xB;
#define getc() (xS == xTT && (xTT = (xS = xB) + fread(xB, 1, 1 << 15, stdin), xS == xTT) ? 0 : *xS++)
#endif
#ifndef DBUFFETT
#define getc() getchar()
#endif
int rd(){
int res = 0, fl = 1;
char c = getchar();
while(!isdigit(c)){
if(c == '-') fl = -1;
c = getchar();
}
while(isdigit(c)){
res = (res << 3) + (res << 1) + c - '0';
c = getchar();
}
return res * fl;
}
int n, m, st[500010], ed[500010], a[500010], pos, k, mingap, minsortgap;
string op;
multiset <int> num, delta;
int main(){
n = rd(); m = rd();
num.insert(-inf); num.insert(inf);
mingap = inf; minsortgap = inf;
for(int i = 1; i <= n; ++i){a[i] = rd(); num.insert(a[i]); st[i] = a[i]; ed[i] = a[i];}
for(int i = 1; i < n; ++i){
mingap = min(mingap, abs(a[i] - a[i + 1]));
delta.insert(abs(a[i] - a[i + 1]));
}
multiset <int> :: iterator numst = num.begin(), numlst;
while(numst != num.end()){
numlst = numst; numst++;
minsortgap = min(minsortgap, abs(*numst - *numlst));
}
multiset <int> :: iterator posk, lstk, nxtk;
for(int i = 1; i <= m; ++i){
cin >> op;
if(op == "INSERT"){
pos = rd(); k = rd();
num.insert(k);
posk = num.find(k);
posk --; lstk = posk; posk ++;
posk ++; nxtk = posk; posk --;
minsortgap = min(minsortgap, min(*posk - *lstk, *nxtk - *posk));
delta.erase(delta.find(abs(st[pos + 1] - ed[pos])));
delta.insert(abs(k - ed[pos]));
delta.insert(abs(st[pos + 1] - k));
ed[pos] = k;
mingap = *delta.begin();
}
else if(op == "MIN_GAP"){
printf("%d\n", mingap);
}
else if(op == "MIN_SORT_GAP"){
printf("%d\n", minsortgap);
}
}
return 0;
}
本文来自博客园,作者:咕咕坤,转载请注明原文链接:https://www.cnblogs.com/GuguKun/p/14979105.html