Problem

给你一个宠物或是领养者的特点值。
若是领养者的特点值为a,有宠物的特点值为b,那么他会领养abs(a-b)最小的值。(如果有a+k和a-k,那么优先领养a-k)
同理,若是宠物的特点值为a,有领养者的特点值为b,那么它会被abs(a-b)最小的值的领养者领养。(如果有a+k和a-k,那么优先被a-k领养)

Solution

一道splay的模板题,另外只要记录下,现在splay中存放的是领养者的特点值,还是宠物的特点值(宠物和领养者在本道题中是等价的)

Notice

要注意记录目前splay是宠物还是领养者。

Code

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define sqz main
#define ll long long
#define reg register int
#define rep(i, a, b) for (reg i = a; i <= b; i++)
#define per(i, a, b) for (reg i = a; i >= b; i--)
#define travel(i, u) for (reg i = head[u]; i; i = edge[i].next)
const int INF = 1e9, N = 80000;
const double eps = 1e-6, phi = acos(-1.0);
ll mod(ll a, ll b) {if (a >= b || a < 0) a %= b; if (a < 0) a += b; return a;}
ll read(){ ll x = 0; int zf = 1; char ch; while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') zf = -1, ch = getchar(); while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;}
void write(ll y) { if (y < 0) putchar('-'), y = -y; if (y > 9) write(y / 10); putchar(y % 10 + '0');}int point = 0, root = 0, pre, suf, opt;
struct node
{int val[N + 5], count[N + 5], num[N + 5], son[2][N + 5], parent[N + 5];inline void up(int u){count[u] = count[son[0][u]] + count[son[1][u]] + num[u];}void Rotate(int x, int &rt){int y = parent[x], z = parent[y];int l = (son[1][y] == x), r = 1 - l;if (y == rt) rt = x;else if (son[0][z] == y) son[0][z] = x;else son[1][z] = x;parent[x] = z;parent[son[r][x]] = y, son[l][y] = son[r][x];parent[y] = x, son[r][x] = y;up(y);up(x);}void Splay(int x, int &rt){while (x != rt){int y = parent[x], z = parent[y];if (y != rt){if ((son[0][z] == y) ^ (son[0][y] == x))Rotate(x, rt);else Rotate(y, rt);}Rotate(x, rt);}}void Insert(int &u, int x, int last){if (u == 0){u = ++point;val[u] = x, parent[u] = last, num[u] = count[u] = 1;Splay(u, root);}else{if (x > val[u]) Insert(son[1][u], x, u);else if (x < val[u]) Insert(son[0][u], x, u);else if (x == val[u]) num[u]++, count[u]++, Splay(u, root);}}void Delete(int x){Splay(x, root);if (num[x] > 1){num[x]--, count[x]--;return;}if (son[0][x] * son[1][x] == 0) root = son[0][x] + son[1][x];else{int t = son[1][x];while (son[0][t] != 0) t = son[0][t];Splay(t, root);son[0][t] = son[0][x], parent[son[0][x]] = t;up(t);}parent[root] = 0;}void Find_pre(int u, int x){if (u == 0) return;if (x > val[u]){pre = u;Find_pre(son[1][u], x);}else Find_pre(son[0][u], x);}void Find_suf(int u,int x){if (u == 0) return;if (x < val[u]){suf = u;Find_suf(son[0][u], x);}else Find_suf(son[1][u], x);}int Find_num(int u, int x){if (x <= count[son[0][u]]) return Find_num(son[0][u], x);if (x > count[son[0][u]] + num[u]) return Find_num(son[1][u], x - count[son[0][u]] - num[u]);return val[u];}int Find_id(int u, int x){if (x == val[u]) return u;if (x > val[u]) return Find_id(son[1][u], x);if (x < val[u]) return Find_id(son[0][u], x);}
}Splay_tree;
int main()
{int n = read();int ans = 0;rep(i, 1, n){int x = read(), y = read();if (!root) Splay_tree.Insert(root, y, 0), opt = x;else if (opt == x) Splay_tree.Insert(root, y, 0);else{pre = suf = -1;Splay_tree.Find_pre(root, y);Splay_tree.Find_suf(root, y);if (pre == -1){ans = (ans + Splay_tree.val[suf] - y) % 1000000;Splay_tree.Delete(suf);}else if (suf == -1){ans = (ans + y - Splay_tree.val[pre]) % 1000000;Splay_tree.Delete(pre);}else{if (y - Splay_tree.val[pre] <= Splay_tree.val[suf] - y){ans = (ans + y - Splay_tree.val[pre]) % 1000000;Splay_tree.Delete(pre);}else{ans = (ans + Splay_tree.val[suf] - y) % 1000000;Splay_tree.Delete(suf);}}}}printf("%d\n", ans);
}

转载于:https://www.cnblogs.com/WizardCowboy/p/7613570.html

[BZOJ1208]宠物收养所相关推荐

  1. BZOJ1208[HNOI2004]宠物收养场——treap

    凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领 ...

  2. bzoj1208: [HNOI2004]宠物收养所

    Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 6182  Solved: 2396 [Submit][Status][Discuss] Descri ...

  3. bzoj1208【HNOI2004】宠物收养所

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec   Memory Limit: 162 MB Submit: 5923   Solved: 2296 [ Submit ...

  4. 洛谷P2286 [HNOI2004]宠物收养所 [STL,平衡树]

    题目传送门 宠物收养所 题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的 ...

  5. B1208 [HNOI2004]宠物收养所 平衡树||set (滑稽)

    这个题是一道splay裸题,但是我不太会写,所以用set直接水过去!!!哈哈哈哈,美滋滋. set总结: set是一个集合,然后里面没用重复的元素.里面有一些函数: begin()     ,返回se ...

  6. 洛谷P2286 [HNOI2004]宠物收养场

    题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

  7. cogs62 [HNOI2004] 宠物收养所

    cogs62 [HNOI2004] 宠物收养所 啦啦啦啦 不维护区间的平衡树题都是树状数组+二分练手题! 不会的参考我的普通平衡树的多种神奇解法之BIT+二分答案 // It is made by X ...

  8. 洛谷 P2286 [HNOI2004]宠物收养场

    题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

  9. BZOJ 1208: [HNOI2004]宠物收养所

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7684  Solved: 3042 [Submit][S ...

  10. 1208: [HNOI2004]宠物收养所

    1208: [HNOI2004]宠物收养所 1.用Treap树写: 只需要三个操作,插入,删除,查找(同时找出其前继后继): View Code /************************** ...

最新文章

  1. php判断是否已关注,php判断用户是否关注微信订阅号或公众号
  2. Maven的单元测试没有执行的问题
  3. Github | TensorFlow Extended (TFX) 面向机器学习工具
  4. 为.NET程序批上WPF的绚丽外衣(1)
  5. Oracle中用于发送邮件的存储过程
  6. UE4之ACharacter移动人物并显示动画效果
  7. 装饰器模式在 Collections 类中的应用
  8. 47. PHP 魔术方法
  9. 证明独立集合问题是NP-complete
  10. HTML基础学习(二)—CSS
  11. php查询过滤字段,php 字符过滤类,用于过滤各类用户输入的数据
  12. 电脑屏幕录制软件免费
  13. 基于Windows AD的单点登录系统
  14. Ubuntu下非常给力的下载工具
  15. php程序员工作日记,PHP程序员战地日记
  16. R语言rank函数详细解析
  17. 经纬财富:巴中美联储措辞乐观 白银难突出重围
  18. http://bbs.csdn.net/topics/392028373
  19. 手把手教你如何用python制作自动翻译程序
  20. CSS属性设置鼠标为手型

热门文章

  1. ios 代码写Button小结
  2. iterm2 + oh my zsh 实现 macOS X 下炫酷终端
  3. 计算机专业的优秀学长寄语大一新生,学长学姐对大一新生的寄语 大学学长学姐寄语励志...
  4. 大一计算机课程学什么,大一新生应该如何学习 主要学什么课程
  5. c++ 学生类和教师类的设计
  6. Computer Architectrure: Quantitative Approch 第三章第四节
  7. 《富爸爸穷爸爸》第一课
  8. 人人车创始人李健的创业之路
  9. 嵌入式硬件设计:电感
  10. 毛笔行书书法-黄鹤楼