例题在最下面
multiset内部由平衡树实现
对于插入的数据会自动从小到大排序,数据可以重复
multiset非常好用(因为不会手写平衡树emm)
multiset的常用操作(绝对常用)
创建multiset
multiset<int>mp;
插入数据
mp.insert(2);
抹除数据
mp.erase(2)
创建一个迭代器用于for循环
multiset<int>::iterator it;(it是迭代器,名字随便你)
for(;it!=mp.end();it++)
cout<<(*it);
由于上面的it类似指针,打印出来需要加*
multiset有自己专用的二分查找函数
multiset<int>::iterator it;
it=mp.lower_bound(x);
如代码所示,lower_bound返回第一个大于等于x的位置的迭代器
upper_bound同理
multiset的常用函数
multiset<int>::iterator it;
it=mp.begin();
it=mp.end();
其中begin()返回第一个位置的迭代器
但是end()函数返回的位置迭代器是开区间的
也就是如果你想得到最后一个位置的迭代器,需要
multiset<int>::iterator it;
it=mp.end();
it--;//往回退一格即可
以上就是常用的操作,不常用的自己补充吧
这题是很好的,简洁的multiset操作题
#include <bits/stdc++.h>
using namespace std;
int n,q,a[32768],ans;
multiset<int>mp;
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> q;
if( mp.empty() ) ans+=q;
else
{
multiset<int>::iterator j;
j=mp.lower_bound(q);
int minn=abs(*j-q);
if( j!=mp.begin() )
{
j--;
minn=min(minn,abs(*j-q));
}
ans+=minn;
}
mp.insert(q);
}
cout<<ans;
}