c++ 中的multiset,默认最小值,要取最大值,要重新声明一个类,并重载<符号
,在多校联合中,看到有重载()的,借用了一下,发现还真能行.
题目:hdu 5349
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
struct classCompare
{
bool operator()(const int& lhs, const int& rhs) //重载(),
{
return lhs > rhs ;
}
};
multiset<int> s1;
multiset<int,classCompare > s2;
int main()
{
std::ios::sync_with_stdio(false);
int n;
int i,j;
int x,y;
while(cin>>n)
{
s1.clear();
s2.clear();
for(i=0;i<n;i++)
{
cin>>x;
int t;
if(x==1)
{
cin>>y;
s1.insert(y);
s2.insert(y);
}
else if(x==2)
{
if(s1.size())
{
t= *s1.begin();
s1.erase(t);
}
{
s2.erase(t);
}
}
else
{
if(s2.size())
cout<<(*s2.begin())<<endl;
else
cout<<0<<endl;
}
}
}
return 0;
}
priority_queue<int> pq 此时默认是大顶堆,c++中唯一大的在前,如果要采用小顶堆,用如下声明:
priority_queue<int,vector<int>,greater<int> >
///
向上取整函数 int ceil(double);
向下取整函数 int floor(double);