题解 [HNOI2008]神奇的国度(BZOJ1006 洛谷P2286)

题目链接

用平衡树按照题意模拟即可。

但是写一个平衡树很麻烦,我们可以用 set 代替。

setupper_bound 函数可以返回一个不比 x 小的最小数的迭代器,将其减一就是比它小的最大数。插入删除也很方便。

#include<bits/stdc++.h>
using namespace std;
int getint(){
	int ans=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		ans=ans*10+c-'0';
		c=getchar();
	}
	return ans*f;
}

set<long long>a,b;

int main(){
	int n=getint();
	long long ans=0;
	a.insert(-0x7ffffffffll),a.insert(0x7ffffffffll);
	b.insert(-0x7ffffffffll),b.insert(0x7ffffffffll);
	while(n--){
		int x=getint(),y=getint();
		if(x){
			if(a.size()>2){
				long long p=*--a.lower_bound(y),q=*a.lower_bound(y);
				//cout<<"! "<<y<<" "<<p<<" "<<q<<endl;
				if(y-p<=q-y)ans+=y-p,a.erase(p);
				else ans+=q-y,a.erase(q),ans%=1000000;
			}else b.insert(y);
		}else{
			if(b.size()>2){
				long long p=*--b.lower_bound(y),q=*b.lower_bound(y);
				//cout<<"? "<<y<<" "<<p<<" "<<q<<endl;
				if(y-p<=q-y)ans+=y-p,b.erase(p);
				else ans+=q-y,b.erase(q),ans%=1000000;
			}else a.insert(y);
		}
	}
	cout<<ans%1000000;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39854734/article/details/88750161
今日推荐