a<231),而他也给每个处在收养所的宠物一个特点值,这样他" />
题目描述:
最近,阿 Q 开了一间宠物收养所。收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。 每个领养者都希望领养到自己满意的宠物,阿 Q 根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值 a(a 是一个正整数,a<231" role="presentation">a<231),而他也给每个处在收养所的宠物一个特点值,这样他就能够很方便的处理整个领养宠物的过程了。
宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少:
被遗弃的宠物过多时,假若到来一个领养者,这个领养者希望领养的宠物的特点值为 a,那么它将会领养一只目前未被领养的宠物中特点值最接近 a 的一只宠物。任何两只宠物的特点值都不可能是相同的,任何两个领养者的希望领养宠物的特点值也不可能是一样的。如果有两只满足要求的宠物,即存在两只宠物他们的特点值分别为 a−b 和 a+b,那么领养者将会领养特点值为 a−b 的那只宠物;收养宠物的人过多,假若到来一只被收养的宠物,那么哪个领养者能够领养它呢?能够领养它的领养者,是那个希望被领养宠物的特点值最接近该宠物特点值的领养者,如果该宠物的特点值为 a,存在两个领养者他们希望领养宠物的特点值分别为 a−b 和 a+b,那么特点值为 a−b 的那个领养者将成功领养该宠物。一个领养者领养了一个特点值为 a 的宠物,而它本身希望领养的宠物的特点值为 b,那么这个领养者的不满意程度为∣a−b∣。你得到了一年当中,领养者和被收养宠物到来收养所的情况,希望你计算所有收养了宠物的领养者的不满意程度的总和。这一年初始时,收养所里面既没有宠物,也没有领养者。
输入格式
第一行为一个正整数 n,表示一年当中来到收养所的宠物和领养者的总数;
接下来的 n 行,按到来时间的先后顺序描述了一年当中来到收养所的宠物和领养者的情况。每行有两个整数 a, b,其中 a=0 表示宠物,a=1 表示领养者,正数 b 表示宠物的特点值或是领养者希望领养宠物的特点值。
同一时间呆在收养所中的,要么全是宠物,要么全是领养者,这些宠物和领养者的个数不会超过 104" role="presentation">104 个。
输出格式
仅有一个正整数,表示一年当中所有收养了宠物的领养者的不满意程度的总和对 106" role="presentation">106 取模以后的结果。
样例
InputOutput5 0 2 0 4 1 3 1 2 1 5
3
分析:该题是要维护宠物/收养者的序列,并模拟收养的过程,由于任意两个宠物或领养者的特点值不会一样,那么我们可以用set及其自带的lower_bound和erase函数来模拟整个收养的过程。
注意输出答案要对1e6取模
AC代码:
#include<bits/stdc++.h>
#define endl "n"
#define P pair<int,int>
#define f first
#define s second
#define ll long long
using namespace std;
int main()
{
int n,sz=0,flag;
set<int> st;
cin>>n;
int a,b;
ll ans=0;
while(n--)
{
cin>>a>>b;
if(sz==0)
{
st.insert(b);
sz++;
flag=a;
}
else if(a==1)
{
if(flag==0)
{
auto it=st.lower_bound(b);
if(it!=st.end()&&*it==b)
{
st.erase(it);
sz--;
}
else
{
if(it==st.end())
{
it--;
ans+=abs(*it-b);
sz--;
st.erase(it);
}
else
{
if(it==st.begin())
{
ans+=abs((*it)-b);
sz--;
st.erase(it);
}
else
{
auto it1=it;
it1--;
if(abs(*it1-b)==abs(*it-b))
{
ans+=abs(*it1-b);
sz--;
st.erase(it1);
}
else if(abs(*it1-b)>abs(*it-b))
{
ans+=abs(*it-b);
sz--;
st.erase(it);
}
else
{
ans+=abs((*it1)-b);
sz--;
st.erase(it1);
}
}
}
}
}
else
{
st.insert(b);
sz++;
}
}
else
{
if(flag==0)
{
sz++;
st.insert(b);
}
else
{
auto it=st.lower_bound(b);
if((*it)==b)
{
st.erase(it);
sz--;
}
else
{
if(it==st.end())
{
it--;
ans+=abs((*it)-b);
sz--;
st.erase(it);
}
else
{
if(it==st.begin())
{
ans+=abs((*it)-b);
sz--;
st.erase(it);
}
else
{
auto it1=it;
it1--;
if(abs((*it1)-b)==abs((*it)-b))
{
ans+=abs((*it1)-b);
sz--;
st.erase(it1);
}
else if(abs((*it1)-b)>abs((*it)-b))
{
ans+=abs((*it)-b);
sz--;
st.erase(it);
}
else
{
ans+=abs((*it1)-b);
sz--;
st.erase(it1);
}
}
}
}
}
}
}
cout<<ans%1000000<<endl;
return 0;
}
相关知识
猫狗收养所
东莞宠物收养所
宠物收养所题解
1566:宠物收养所
宠物收养所 (SBT)
[BZOJ1208]宠物收养所(Splay)
如何联系宠物收养所?
a=b++,c++和a=(b++,c++)的区别
宠物收养所创业计划书模板.pptx
C++程序设计(上)练习
网址: 宠物收养所(c++) https://m.mcbbbk.com/newsview581257.html
上一篇: 求解逻辑问题:谁养鱼 |
下一篇: 问道宠物天技一览表 |