#平衡树,set#洛谷 2286 [HNOI2004]宠物收养场

题目


分析

由于宠物被领养者领养和领养者领养宠物操作是一样的,
考虑建两棵平衡树维护操作,以领养者领养宠物为例
若当前没有宠物,就将领养者加入平衡树中,
否则选择最接近的特点值的宠物统计答案并删除该宠物


代码

#include <cstdio>
#include <cctype>
#include <set>
#define rr register
using namespace std;
const int mod=1000000;
set<int>uk[2]; int ans;
set<int>::iterator it;
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
signed main(){
	for (rr int T=iut();T;--T){
		rr int z=iut(),x=iut(),t1,t2;
		if (uk[z^1].empty()) {uk[z].insert(x); continue;}
		it=uk[z^1].begin(); if (x<(*it)) {ans=mo(ans,((*it)-x)%mod),uk[z^1].erase(it); continue;}
		it=--uk[z^1].end(); if (x>(*it)) {ans=mo(ans,(x-(*it))%mod),uk[z^1].erase(it); continue;}
		it=uk[z^1].lower_bound(x),t2=*it,--it,t1=*it;
		if (x-t1<=t2-x) ans=mo(ans,(x-t1)%mod),uk[z^1].erase(it);
		    else ans=mo(ans,(t2-x)%mod),uk[z^1].erase(++it);
	}
	return !printf("%d",ans);
} 
原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13531932.html