Input
多组数据
一行为一个正整数n(n<=80000)如题意;
接下来的n行,按到来时间的先后顺序描述了十五拿衣服种类和属性值每行有两个正整数a, b,其中a=0表示衬衫,a=1表示裤子,b表示衬衫的特点值或是裤子的特点值。(同一时间内十五手上的衣服不会超过10000个)
Output
每组数据输出一个正整数,表示十五搭配完全部衣服后的衣服属性差的总和mod 1000000以后的结果。
Sample Input
5
0 2
0 4
1 3
1 2
1 5
Sample Output
3
Hint
(abs(3-2) + abs(2-4)=3,最后一个裤子没有衣服可以配~)
十五酱最萌了昂~
在做STL专题的时候遇见了,STL中最不熟悉使用的就是multiset,偷偷学习了大佬的代码,来复习一下.
STL中的multiset有自动排序的功能,并且允许存在重复元素,可以用lower_bound来找到第一个大于等于b的数,找到的如果是第一个,那么就计算第一个,如果是最后一个,就计算最后一个的上一个,如果是中间的,则需要将前后两个比较一下,若差值一样,就返回属性值较小的一个。(记得要将符合的元素从multiset中删除)
#include<cstdio>
#include<iostream>
#include<set>
#include<cmath>
#include<cstring>
using namespace std;
const int mod = 1000000;
multiset<int>m;
int main()
{
int n,sum,a,b,flag;
while(~scanf("%d",&n))
{
sum = 0;
flag = -1;
for(int i=0; i<n; i++)
{
scanf("%d%d",&a,&b);
if(flag==-1)
{
flag=a;
m.insert(b);
}
else if(a==flag)
{
m.insert(b);
}
else
{
multiset<int>::iterator it1;
multiset<int>::iterator it2;
it1 = m.lower_bound(b);
it2=it1;
it1--;
if(it2==m.begin())//如果找到的是第一个元素
{
sum += (abs(b-*it2));
m.erase(it2);
sum %= mod;
}
else if(it2==m.end())//如果找到的是最后一个元素
{
sum += (abs(b-*it1));
m.erase(it1);
sum %= mod;
}
else //如果找到的是中间的元素
{
if( abs(b-*it2) < abs(b-*it1))//如果属性差值一样,那么十五就会选择属性值较小的一个
{
sum += (abs(b-*it2));
m.erase(it2);
sum %= mod;
}
else
{
sum += (abs(b-*it1));
m.erase(it1);
sum %= mod;
}
}
}
if(m.empty())
{
flag=-1;
}
}
printf("%d\n",sum%mod);
}
return 0;
}