「HNOI2004」宠物收养场

传送门

对宠物和人各维护一棵平衡树,每次 \(\text{split}\) 的时候记得判一下子树是否为空,然后模拟就好了。

参考代码:

  1. #include <algorithm>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #define rg register
  5. #define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
  6. using namespace std;
  7. template < class T > inline void read(T & s) {
  8. s = 0; int f = 0; char c = getchar();
  9. while ('0' > c || c > '9') f |= c == '-', c = getchar();
  10. while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
  11. s = f ? -s : s;
  12. }
  13. const int _ = 8e4 + 5, mod = 1e6;
  14. int n, rt1, rt2, tot, siz[_], val[_], pri[_], ch[2][_];
  15. inline int Newnode(int v)
  16. { return siz[++tot] = 1, val[tot] = v, pri[tot] = rand(), tot; }
  17. inline void pushup(int p) { siz[p] = siz[ch[0][p]] + siz[ch[1][p]] + 1; }
  18. inline int merge(int x, int y) {
  19. if (!x || !y) return x + y;
  20. if (pri[x] > pri[y])
  21. return ch[1][x] = merge(ch[1][x], y), pushup(x), x;
  22. else
  23. return ch[0][y] = merge(x, ch[0][y]), pushup(y), y;
  24. }
  25. inline void split(int p, int v, int& x, int& y) {
  26. if (!p) { x = y = 0; return ; }
  27. if (val[p] <= v)
  28. return x = p, split(ch[1][p], v, ch[1][x], y), pushup(p);
  29. else
  30. return y = p, split(ch[0][p], v, x, ch[0][y]), pushup(p);
  31. }
  32. inline int kth(int p, int k) {
  33. if (siz[ch[0][p]] + 1 > k) return kth(ch[0][p], k);
  34. if (siz[ch[0][p]] + 1 == k) return val[p];
  35. if (siz[ch[0][p]] + 1 < k) return kth(ch[1][p], k - siz[ch[0][p]] - 1);
  36. }
  37. inline void insert(int& rt, int item) {
  38. int a, b;
  39. split(rt, item, a, b);
  40. rt = merge(a, merge(Newnode(item), b));
  41. }
  42. inline void erase(int& rt, int item) {
  43. int a, b, c;
  44. split(rt, item, a, c);
  45. split(a, item - 1, a, b);
  46. b = merge(ch[0][b], ch[1][b]);
  47. rt = merge(a, merge(b, c));
  48. }
  49. inline int match(int& rt, int item) {
  50. int a, b, x, y, res;
  51. split(rt, item, a, b);
  52. if (a == 0 && b != 0) res = kth(b, 1);
  53. if (a != 0 && b == 0) res = kth(a, siz[a]);
  54. if (a != 0 && b != 0)
  55. x = kth(a, siz[a]), y = kth(b, 1), res = item - x <= y - item ? x : y;
  56. rt = merge(a, b);
  57. return res;
  58. }
  59. int main() {
  60. #ifndef ONLINE_JUDGE
  61. file("cpp");
  62. #endif
  63. read(n);
  64. int ans = 0;
  65. for (rg int a, b, x, i = 1; i <= n; ++i) {
  66. read(a), read(b);
  67. if (a == 0) {
  68. if (rt2 == 0) insert(rt1, b);
  69. else x = match(rt2, b), erase(rt2, x), ans = (ans + abs(x - b)) % mod;
  70. } else {
  71. if (rt1 == 0) insert(rt2, b);
  72. else x = match(rt1, b), erase(rt1, x), ans = (ans + abs(x - b)) % mod;
  73. }
  74. }
  75. printf("%d\n", ans);
  76. return 0;
  77. }

「HNOI2004」宠物收养场的更多相关文章

  1. [HNOI2004]宠物收养场 Treap前驱后继

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

  2. P2286 [HNOI2004]宠物收养场

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

  3. 洛谷P2286 [HNOI2004]宠物收养场【Treap】题解+AC代码

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

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

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

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

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

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

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

  7. [HNOI2004]宠物收养场 BZOJ1208 splay tree

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

  8. LG_2286_[HNOI2004]宠物收养场

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

  9. 宠物收养场 Treap

    宠物收养场 时间限制: 1 Sec  内存限制: 128 MB 题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠 ...

随机推荐

  1. 一周搞定模拟电路P2_二极管介绍_记录

    1 稳压二极管 1.1 稳压二极管伏安特性曲线 ΔIz 这一段为能够达到比较好的稳压效果的稳压电流. 1.2 两种连接方法的比较 2 整流二极管 2.1 特点 用于把交流电变成脉动直流电 3 开关二极 ...

  2. Vue基础笔记2

    目录 1. 如何获取Vue对象中的成员? 2. pre指定 3. for循环 4. todolist 5. 分隔符 6. computed 计算后的 7. vue的生命周期(讲解不全) 8. watc ...

  3. MySQL导出数据到文件报错

    执行如下语句: mysql> select * from users into outfile "F:\Develop\MySQL57\Uploads\users.txt" ...

  4. C do...while 循环

    不像 for 和 while 循环,它们是在循环头部测试循环条件.在 C 语言中,do...while 循环是在循环的尾部检查它的条件. do...while 循环与 while 循环类似,但是 do ...

  5. BZOJ5319/LOJ2551「JSOI2018」列队

    问题描述 作为一名大学生,九条可怜在去年参加了她人生中的最后一次军训. 军训中的一个重要项目是练习列队,为了训练学生,教官给每一个学生分配了一个休息位置.每次训练开始前,所有学生都在各自的休息位置休息 ...

  6. git 工具常见命令

    1.git是什么 git是分布式版本管理工具,一台电脑既可以是客户端,也可以是服务端.工作过程中可以断开网络. git中的三个概念: 1.版本库:在初始化git版本库之后会生成一个隐藏的文件, .gi ...

  7. python中getpass模块

    1 import getpass 2 name = input('请输入你的名字:') 3 passwd = getpass.getpass('请输入你的密码:') 4 print(name) 5 p ...

  8. Mybatic逆向工程的使用

    前言:利用别人的方法.知识.经历或精神成为你自己,不思考不实践不总结不反馈,就不会变成你的. 转载必须表明出处:https://www.cnblogs.com/fby698/p/9463831.htm ...

  9. PyQt5控件支持拖拽方法

    让控件支持拖拽动作A.setDragEnable(True) 设置A可以拖动B.setAcceptDrops(True) 设置B可以接受拖动B需要满足两个事件1.dragEnterEvent 将A拖到 ...

  10. 02-16Android学习进度报告十六

    今天主要学习了GridView(网格视图)的基本使用和一些基本概念. 下面是GridView中的一些属性: android:columnWidth:设置列的宽度 android:gravity:组件对 ...