模拟赛抽象 20pts 代码求调
查看原帖
模拟赛抽象 20pts 代码求调
728483
wwwidk1234楼主2024/11/26 22:53

场上没调出来 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
*/
2024/11/26 22:53
加载中...