[HNOI2004]宠物收养所
来源:互联网 发布:网络主播收入堪比明星 编辑:程序博客网 时间:2024/04/28 05:04
Description
最近,阿Q开了一间宠物收养所。收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值
1. 被遗弃的宠物过多时,假若到来一个领养者,这个领养者希望领养的宠物的特点值为
2. 收养宠物的人过多,假若到来一只被收养的宠物,那么哪个领养者能够领养它呢?能够领养它的领养者,是那个希望被领养宠物的特点值最接近该宠物特点值的领养者,如果该宠物的特点值为
任务描述
你得到了一年当中,领养者和被收养宠物到来收养所的情况,希望你计算所有收养了宠物的领养者的不满意程度的总和。这一年初始时,收养所里面既没有宠物,也没有领养者。
Input
第一行为一个正整数
Output
仅有一个正整数,表示一年当中所有收养了宠物的领养者的不满意程度的总和
Sample Input
5
0 2
0 4
1 3
1 2
1 5
Sample Output
3
(
HINT
Source
思路
这道题就是一道SBT水题啊,对于宠物和领养者可以共用一棵树,只要开一个变量记录树中存放的是宠物还是领养者就可以了。
代码
#include <cstdio>#include <iostream>const int maxn=200000;const int mo=1000000;int ans,k;struct splay_tree{ int son[2][maxn+10],fa[maxn+10],tot,val[maxn+10],root; inline int t(int x) { return son[1][fa[x]]==x; } inline int rotate(int x) { int f=fa[x],k=t(x); if(fa[f]) { son[t(f)][fa[f]]=x; } fa[x]=fa[f]; son[k][f]=son[!k][x]; if(son[k][f]) { fa[son[k][f]]=f; } son[!k][x]=f; fa[f]=x; return 0; } inline int splay(int x,int c) { while(fa[x]!=c) { int f=fa[x]; if(fa[f]==c) { rotate(x); } else if(t(x)==t(f)) { rotate(f); rotate(x); } else { rotate(x); rotate(x); } } if(!c) { root=x; } return 0; } inline int ins(int x) { ++tot; val[tot]=x; if(!root) { root=tot; fa[tot]=0; return 0; } int now=root; while(now) { int k=(val[now]<x); if(!son[k][now]) { son[k][now]=tot; fa[tot]=now; splay(tot,0); break; } now=son[k][now]; } return 0; } inline int pre(int x) { splay(x,0); int now=son[0][x]; while(son[1][now]) { now=son[1][now]; } return now; } inline int nex(int x) { splay(x,0); int now=son[1][x]; while(son[0][now]) { now=son[0][now]; } return now; } inline int del(int x) { int p=pre(x); if(!p) { root=son[1][x]; fa[son[1][x]]=0; return 0; } splay(p,x); root=p; if(son[1][x]) { fa[son[1][x]]=p; } son[1][p]=son[1][x]; son[0][x]=son[1][x]=fa[x]=0; fa[p]=0; return 0; } inline int calc(int x,int kind) { if(!root) { ins(x); k=kind; return 0; } ins(x); if(k!=kind) { int p=pre(tot),n=nex(tot); if(!p) { ans+=val[n]-x; del(n); } else if(!n) { ans+=x-val[p]; del(p); } else if(x-val[p]<=val[n]-x) { ans+=x-val[p]; del(p); } else { ans+=val[n]-x; del(n); } ans%=mo; del(tot); } return 0; }};splay_tree st;int n;int main(){ scanf("%d",&n); while(n--) { int a,b; scanf("%d%d",&a,&b); st.calc(b,a); } printf("%d\n",ans); return 0;}
- [HNOI2004]宠物收养所
- HNOI2004宠物收养所
- HNOI2004-宠物收养所
- 【HNOI2004】宠物收养所
- [HNOI2004]宠物收养所
- HNOI2004 宠物收养所
- [HNOI2004]宠物收养所
- [HNOI2004]宠物收养所 SBT
- HNOI2004 宠物收养所 SBT
- 【HNOI2004】【SBT】宠物收养所
- [bzoj1208] [HNOI2004]宠物收养所
- [Bzoj1208][HNOI2004]宠物收养所
- BZOJ1208 [HNOI2004]宠物收养所
- [BZOJ1208][HNOI2004]宠物收养所
- 【bzoj1208】[HNOI2004]宠物收养所
- bzoj1208【HNOI2004】宠物收养所
- BZOJ1208: [HNOI2004]宠物收养所
- [HNOI2004]宠物收养所 (Splay)
- 重入锁:ReentrantLock 详解
- Java基础知识:继承(1)
- 树莓派3B刷机及ssh问题解决
- jquery datepicker只显示年和月
- Solr学习总结(一)两种启动方式
- [HNOI2004]宠物收养所
- 使用git上出项目到github
- App框架实现———dagger2
- 一个简单分析监测类的实现
- java面试基础+进阶
- [吴恩达 DL] CLass2 Week2 Mini-batch梯度下降 课程总结+代码实现
- PyQt5:实现Tetris
- Android Studio 之 导入Eclipse项目常见问题及解决方案 在将Eclipse做的Android项目成功导入Android Studio 后,启动生成,遇到一些问题,现总结如下:
- java中如何提取多个字符串相同的字符