场上没调出来 0pts,赛后改来改去也是 20pts
提交记录:record
/*
期望得分:100pts
算法:二分
思路:添加员工时,按照升序排序,要找员工时,找一个离x最近的元素丢给用人单位
单次O(log n),总共O(n log n)
我是嘉明和那维莱特的____!
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
constexpr int N=80007;
constexpr int mod=1000000;
vector<ll> p; //员工
inline void add(int x) //添加员工
{
if(p.empty()) p.push_back(x);
else
{
auto it=lower_bound(p.begin(),p.end(),x);
p.insert(it,x);
}
}
inline vector<ll>::iterator find_nearest(ll x) //找一个离x最近的元素
{
if(p.size()==1) return p.begin();
auto it=lower_bound(p.begin(),p.end(),x);
if(it==p.end()) return it;
if(it!=p.begin())
{
auto it1=it-1;
if(abs(x-*it1)<=abs(x-*it)) return it1;
else return it;
}
return it;
}
inline ll get(ll x)
{
if(p.empty()) return 0;
auto it=find_nearest(x);
int tedian=*it; //求职者特点值
p.erase(it);
return abs(tedian-x)%mod;
}
int main()
{
// freopen("applicant.in","r",stdin);
// freopen("applicant.out","w",stdout);
int Neuvillette,op;
ll x;
cin>>Neuvillette;
ll s=0;
while(Neuvillette--)
{
cin>>op>>x;
if(op==0) add(x); //求职者
else s=(s+abs(get(x)))%mod; //用人单位
// cerr<<10-Q<<':';
// for(ll v:p) cerr<<v<<' ';
// cerr<<'\n';
}
cout<<s;
return 0;
}
/*
hack:
4
1 2
1 3
0 1
1 2
*/
/*
hack:
10
0 4
0 2
0 10
0 7
0 9
1 5
1 1
1 6
1 8
1 3
q=01:0 4 此时vector<int> p=4
q=02:0 2 此时vector<int> p=2 4
q=03:0 10 此时vector<int> p=2 4 10
q=04:0 7 此时vector<int> p=2 4 7 10
q=05:0 9 此时vector<int> p=2 4 7 9 10
q=06:1 1:带走2 此时vector<int> p=4 7 9 10
q=07:1 5:带走4 此时vector<int> p=7 9 10
q=08:1 6:带走7 此时vector<int> p=9 10
q=09:1 8:带走9 此时vector<int> p=10
q=10:1 3:带走10 此时vector<int> p=空
ans=1+1+1+1+7=11
*/