好久没写题解了。。
最近发现一个很厉害的库,叫pb_ds。官方文档
重要的是比赛能用!!!!!!
里面的容器不止支持stl里的基础操作,还有一些很高级的东西。比如在stl的set中,并没有一个函数支持找排名为k的值或某个值的排名,然而在pb_ds中的tree中,这些都有。
就用这题来实战一下吧。
用一个标记表示宠物店里的是人还是狗,来了一个异类就配对,用lower_bound和upper_bound找出前驱和后继。
#include<cstdio>
#include<cstring>
#include<ext/pb_ds/assoc_container.hpp>
#define mod 1000000
using namespace __gnu_pbds;
long long n,tf=-1;
long long ans=0;
tree<long long,null_type>tr;
int main()
{
scanf("%lld",&n);
while(n--)
{
long long x,y;
scanf("%lld%lld",&x,&y);
if(tr.empty())
tf=x;
if(tf==x)
{
tr.insert(y);
}
else
{
tree<long long,null_type>::iterator it1=tr.lower_bound(y),it2=tr.upper_bound(y);
if(it1==tr.begin())
{
ans+=*it1-y;
tr.erase(it1);
}
else if(*it1==y)
tr.erase(it1);
else
{
it1--;
if(it2==tr.end()||y-*it1<=*it2-y)
{
ans+=y-*it1;
tr.erase(it1);
}
else
{
ans+=*it2-y;
tr.erase(it2);
}
}
ans%=mod;
}/*
printf("%d\n",tf);
for(tree<int,null_type>::iterator it=tr.begin();it!=tr.end();it++)
printf("%d ",*it);
puts("");*/
}
printf("%lld",ans);
}