可以实现:
有序插入(复杂度nlogn)
lower_bound upper_bound
迭代器访问
相当于一个可以二分的链表,好妙啊QAQ
#include <set>
multiset<int> qaq;
struct point{
int num,data;
bool operator < (point tmp)const
{
return data<tmp.data;
}
}
multiset<point> qwq;//重载运算符
用法与基本函数
point *k=qaq.begin();//qaq.end()
//qaq.begin()返回头指针,end()返回尾指针
point temp;
temp.data=233;
qaq.lower_bound(temp);
//返回第一个大于等于temp.money的东西的地址
//[begin,end)
//要排除空指针干扰?初始化的时候往里面塞一个极大值一个极小值
洛谷P2234 [HNOI2002]营业额统计
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
const int N=32770;
const int inf=2147483647;
const int Maxai=2333333;
struct point{
int num,money;
bool operator < (point tmp)const//ÖØÔØÔËËã·ûº¯Êý
{
return money<tmp.money;
}
};
int n,totans,ans;
multiset<point> q1;
multiset<point> q2;
int read(){
char a=getchar();
int cal=0;
bool flag=1;
while(a!='-'&&(a>'9'||a<'0')) a=getchar();
if(a=='-'){
flag=0;
a=getchar();
}
while(a>='0'&&a<='9'){
cal*=10;
cal+=a-'0';
a=getchar();
}
if(!flag) return -cal;
return cal;
}
void init(){
point BoundA,BoundB;
BoundA.money=Maxai;
BoundB.money=-Maxai;
q1.insert(BoundA);
q1.insert(BoundB);
q2.insert(BoundA);
q2.insert(BoundB);
}
int main(){
n=read();
init();
for(int i=1;i<=n;i++){
point temp,temp2;
temp.money=read();
temp.num=i;
temp2.num=i;
temp2.money=-temp.money;
if(i==1) totans+=temp.money;
else{
point k2=*q2.lower_bound(temp2),k=*q1.lower_bound(temp);
ans=min(abs(-k2.money-temp.money),abs(k.money-temp.money));
// printf("k.money=%d k2.money=%d ans=%d\n",k.money,k2.money,ans);
totans+=ans;
}
q2.insert(temp2);
q1.insert(temp);
}
printf("%d",totans);
return 0;
}
迭代器遍历
for (std::multiset<point>::iterator it=q2.begin(); it!=q2.end(); ++it)
std::cout << ' ' << (*it).money<<endl;
for (std::multiset<point>::iterator it=q1.begin(); it!=q1.end(); ++it)
std::cout << ' ' << (*it).money<<endl;