HYSBZ 1208 宠物收养所

Description

最近,阿Q开了一间宠物收养所。收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值。这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少。 1. 被遗弃的宠物过多时,假若到来一个领养者,这个领养者希望领养的宠物的特点值为a,那么它将会领养一只目前未被领养的宠物中特点值最接近a的一只宠物。(任何两只宠物的特点值都不可能是相同的,任何两个领养者的希望领养宠物的特点值也不可能是一样的)如果有两只满足要求的宠物,即存在两只宠物他们的特点值分别为a-b和a+b,那么领养者将会领养特点值为a-b的那只宠物。 2. 收养宠物的人过多,假若到来一只被收养的宠物,那么哪个领养者能够领养它呢?能够领养它的领养者,是那个希望被领养宠物的特点值最接近该宠物特点值的领养者,如果该宠物的特点值为a,存在两个领养者他们希望领养宠物的特点值分别为a-b和a+b,那么特点值为a-b的那个领养者将成功领养该宠物。 一个领养者领养了一个特点值为a的宠物,而它本身希望领养的宠物的特点值为b,那么这个领养者的不满意程度为abs(a-b)。【任务描述】你得到了一年当中,领养者和被收养宠物到来收养所的情况,希望你计算所有收养了宠物的领养者的不满意程度的总和。这一年初始时,收养所里面既没有宠物,也没有领养者。

Input

第一行为一个正整数n,n<=80000,表示一年当中来到收养所的宠物和领养者的总数。接下来的n行,按到来时间的先后顺序描述了一年当中来到收养所的宠物和领养者的情况。每行有两个正整数a, b,其中a=0表示宠物,a=1表示领养者,b表示宠物的特点值或是领养者希望领养宠物的特点值。(同一时间呆在收养所中的,要么全是宠物,要么全是领养者,这些宠物和领养者的个数不会超过10000个)

Output

仅有一个正整数,表示一年当中所有收养了宠物的领养者的不满意程度的总和mod 1000000以后的结果。

Sample Input

5
0 2
0 4
1 3
1 2
1 5

Sample Output

3

(abs(3-2) + abs(2-4)=3,最后一个领养者没有宠物可以领养)

splay删除

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<functional>
using namespace std;
typedef unsigned long long ull;
typedef long long LL;
const int low(int x){ return x&-x; }
int n, x, y;
LL ans;

struct Splays
{
	const static int maxn = 3e5 + 10;			//节点个数
	const static int INF = 0x7FFFFFFF;			//int最大值
	int ch[maxn][2], F[maxn], sz;				//左右儿子,父亲节点和节点总个数
	int A[maxn];
	int Node(int f, int a) { A[sz] = a; ch[sz][0] = ch[sz][1] = 0; F[sz] = f; return sz++; }//申请一个新节点
	void clear(){ sz = 1; ch[0][0] = ch[0][1] = F[0] = 0; }//清空操作
	void rotate(int x, int k)
	{
		int y = F[x]; ch[y][!k] = ch[x][k]; F[ch[x][k]] = y;
		if (F[y]) ch[F[y]][y == ch[F[y]][1]] = x;
		F[x] = F[y];    F[y] = x;	ch[x][k] = y;
	}
	void Splay(int x, int r)
	{
		for (int fa = F[r]; F[x] != fa;)
		{
			if (F[F[x]] == fa) { rotate(x, x == ch[F[x]][0]); return; }
			int y = x == ch[F[x]][0], z = F[x] == ch[F[F[x]]][0];
			y^z ? (rotate(x, y), rotate(x, z)) : (rotate(F[x], z), rotate(x, y));
		}
	}
	void insert(int &x, int a)
	{
		if (!x) { x = Node(0, a); return; }
		int now = 0;
		for (int i = x; i; i = ch[i][A[i] < a])
		{
			if (!ch[i][A[i] < a]) { now = ch[i][A[i] < a] = Node(i, a); break; }
		}
		Splay(now, x);	x = now;
	}
	void remove(int &x, int y)
	{
		int now = x;
		for (int i = x; i; i = ch[i][A[i] < y])
		{
			if (A[now] < y || A[i] >= y&&A[i] < A[now]) now = i;
		}
		Splay(now, x);	x = now;
		if (A[x] < y) {	(ans += y - A[x]) %= 1000000; x = ch[x][0];	F[x] = 0; return; }
		if (!ch[x][0]) { (ans += A[x] - y) %= 1000000; x = ch[x][1]; F[x] = 0; return; }
		for (int i = ch[x][0]; i; i = ch[i][1])
		{
			if (!ch[i][1]){ Splay(i, ch[x][0]); ch[x][0] = i; break; }
		}
		if (y - A[ch[x][0]] <= A[x] - y)
		{
			(ans += y - A[ch[x][0]]) %= 1000000;
			ch[x][0] = ch[ch[x][0]][0];
			F[ch[x][0]] = x;
		}
		else
		{
			(ans += A[x] - y) %= 1000000;
			ch[ch[x][0]][1] = ch[x][1];
			F[ch[x][1]] = ch[x][0];
			F[ch[x][0]] = 0;
			x = ch[x][0];
		}
	}
}solve;


int main()
{
	while (scanf("%d", &n) != EOF)
	{
		solve.clear();
		int root = ans = 0, k = -1;
		for (int i = 0; i < n; i++)
		{
			scanf("%d%d", &x, &y);
			if (k == -1) k = x, solve.insert(root, y);
			else if (x == k) solve.insert(root, y);
			else solve.remove(root, y);
			if (!root) k = -1;
		}
		printf("%lld\n", ans);
	}
	return 0;
}


流浪宠物求助和收养数据库的需求分析主要包括以下几个方面: 1. 宠物信息管理:数据库需要能够存储和管理流浪宠物的基本信息,包括宠物的种类、性别、年龄、体重、健康状况等。同时,还需要记录宠物的照片和描述信息,以便用户能够更好地了解宠物的情况。 2. 求助信息管理:数据库需要能够存储和管理用户发布的求助信息,包括用户的联系方式、求助的宠物种类、地点、时间等。同时,还需要记录求助的详细描述和相关照片,以便其他用户能够及时了解并提供帮助。 3. 收养信息管理:数据库需要能够存储和管理用户发布的收养信息,包括用户的联系方式、收养宠物种类、地点、时间等。同时,还需要记录收养的详细描述和相关照片,以便其他用户能够了解并选择合适的宠物进行收养。 4. 用户管理:数据库需要能够存储和管理用户的注册信息,包括用户名、密码、联系方式等。同时,还需要记录用户的收养历史和求助历史,以便用户能够方便地查看自己的活动记录。 5. 地理位置管理:数据库需要能够存储和管理宠物的地理位置信息,以便用户能够根据地理位置进行搜索和筛选。 6. 搜索和筛选功能:数据库需要提供搜索和筛选功能,以便用户能够根据自己的需求找到合适的流浪宠物或者求助信息。搜索和筛选的条件可以包括宠物种类、地理位置、年龄等。 7. 安全和权限管理:数据库需要提供安全和权限管理功能,以确保用户的信息和数据安全。同时,还需要对管理员和普通用户进行权限管理,以便管理员能够对数据库进行管理和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值