multiset
声明一个multiset,按升序排列,默认升序排列 multiset<int>set1; 等价于: 或 multiset<int,less<int>>set1; 声明一个multiset,按降序排列 multiset<int, greater<int>>set1;
函数 用法 作用
insert() set1.insert(n) 向集合插入元素n,n可以为重复值
erase() set1.erase(10) 在set1中删除元素等于10的所有副本
empty() set1.empty() 返回值bool类型,若set1为空,则返回true
swap() set1.swap(set2) 将set1和set2交换
size() set1.size() 返回值为int类型,set1当前存放的元素的个数
find() set1.find(n) 返回iterator,指向第一个找到数值n的位置,若找不到则返回的iterator等于set1.end()
resize() set1.resize(10) 重置set1的大小为10
lower_bound() set1.lower_bound(n) 返回set1中第一个找到数值n的位置的iterator,如果找不到则返回end()
upper_bount() set1.upper_bound(n) 返回set1中最后一个找到数值n的位置的后一个位置的iterator,如果找不到则返回end()
count() set1.count(n) 确定set1中数值n出现的次数
multiset<int>q; //定义一个multiset,尖括号里写类型 //如果是自定义类型,需要重载小于号 q.insert(x); //插入一个数 x q.clear(); //清空 q.erase(x); //删除容器中的所有值为 x 的数 q.erase(it); //删除容器中迭代器it指向的元素 q.empty(); //返回bool值,如果容器为空返回true,否则返回false q.size() //返回元素个数 q.begin(); //返回首个元素的迭代器 q.end(); //返回最后一个元素的下一个位置的迭代器 q.count(x); //返回容器中 x 的个数 q.find(x); //返回容器中第一个x的位置(迭代器),如果没有就返回q.end() q.lower_bound(x); //返回容器中第一个大于等于x的数的迭代器 q.upper_bound(x); //返回容器中第一个大于x的数的迭代器
//https://www.luogu.com.cn/problem/P5076 #include<bits/stdc++.h> #define int long long using namespace std; const int N=2e5+10; int n,m,res,t; multiset<int>s; signed main() { cin>>t; s.insert(-2147483647); s.insert(2147483647); //提前放入这两个数,避免错误 while(t--){ cin>>n>>m; if(n==1){ auto x=s.lower_bound(m); //auto是自动判断数据类型,只有C++14以上才支持 //可以写作multiset<int>::iterator,因为lower_bound方法返回的是迭代器 // it 取得 x 的位置 int pos=0; for(auto i=s.begin();i!=x;i++,pos++); cout<<pos<<endl; } else if(n==2){ int pos=-1; for(int i:s) if(++pos==m) cout<<i<<endl; //缩写,order先自增一,再判断是否与x相等 //如果是(order++==x),那就是先判断再自增,这里要尤其注意 //注意这里的for(:)循环,是只有C++11以上才支持的 //和auto一样,都是noip不能用的 //这种循环,i就是容器里的值而不是下标 //也可以使用迭代器循环,上面的循环等价于 /* for(multiset<int>::iterator it=q.begin();it!=q.end();it++) { order++; if(order==x) printf("%d\n",*it); } */ //这种循环是noip可以使用的 } else if(n==3){ auto x=s.lower_bound(m); cout<<*--x<<endl; //这句是先自减,再输出,是缩写 //等价于: /* it--; printf("%d\n",*it); */ //因为是迭代器(指针),所以输出前面加 } else if(n==4) cout<<*s.upper_bound(m)<<endl; else s.insert(m); } return 0; }