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;
}


posted @ 2021-07-06 21:39  咕咕坤  阅读(280)  评论(0编辑  收藏  举报