BZOJ1208 HNOI2004 宠物收养所


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

HINT

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


脑洞清奇的非旋Treap做法,看到题目中描述了两个时间,送宠物和领宠物,我们可以很容易的发现我们需要维护一个可以支持插入(送宠物),删除(领宠物),查询前驱+后继(匹配领哪一只)的数据结构,果断敲非旋Treap,思路是维护两棵Treap,一棵记录当前的宠物有哪些,另一棵记录当前没有满足的领宠物需求有哪些,容易发现,两棵Treap在同一时刻只有一个不为空,所以我们只需要在询问的时候判断一下需要访问的那一棵树是不是空,如果为空就在相应的树中插入,否则在另一棵树中查询答案后删除

写的时候因为把节点标号误认为是权值GG掉了。。。

大爱非旋Treap


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. LL read(){
  5. LL ans=0,w=1;char c=getchar();
  6. while(!isdigit(c)&&c!='-')c=getchar();
  7. if(c=='-')w=-1,c=getchar();
  8. while(isdigit(c))ans=ans*10+c-'0',c=getchar();
  9. return ans*w;
  10. }
  11. #define N 80010
  12. typedef pair<LL,LL> pi;
  13. const LL Mod=1e6;
  14. struct Treap{
  15. LL siz[N],val[N],key[N],son[N][2],tot,root;
  16. void clear(){tot=root=0;}
  17. LL new_treap_point(LL vl){
  18. LL newt=++tot;
  19. siz[newt]=1;
  20. son[newt][0]=son[newt][1]=0;
  21. val[newt]=vl;
  22. key[newt]=rand();
  23. return newt;
  24. }
  25. void update(LL o){
  26. siz[o]=siz[son[o][0]]+siz[son[o][1]]+1;
  27. }
  28. LL merge(LL a,LL b){
  29. if(!a)return b;
  30. if(!b)return a;
  31. if(key[a]<key[b]){
  32. son[a][1]=merge(son[a][1],b);
  33. update(a);return a;
  34. }else{
  35. son[b][0]=merge(a,son[b][0]);
  36. update(b);return b;
  37. }
  38. }
  39. pi split(LL o,LL k){
  40. if(!o)return pi(0,0);
  41. pi ans;
  42. if(siz[son[o][0]]>=k){
  43. pi tmp=split(son[o][0],k);
  44. son[o][0]=tmp.second;
  45. update(o);
  46. ans.first=tmp.first;
  47. ans.second=o;
  48. }else{
  49. pi tmp=split(son[o][1],k-siz[son[o][0]]-1);
  50. son[o][1]=tmp.first;
  51. update(o);
  52. ans.first=o;
  53. ans.second=tmp.second;
  54. }
  55. return ans;
  56. }
  57. LL getrank(LL o,LL vl){
  58. if(!o)return 0;
  59. if(val[o]==vl)return siz[son[o][0]]+1;
  60. else if(val[o]>vl)return getrank(son[o][0],vl);
  61. else return getrank(son[o][1],vl)+siz[son[o][0]]+1;
  62. }
  63. void insert(LL vl){
  64. LL k=getrank(root,vl);
  65. pi x=split(root,k);
  66. LL o=new_treap_point(vl);
  67. root=merge(merge(x.first,o),x.second);
  68. }
  69. void erase(LL vl){
  70. LL k=getrank(root,vl);
  71. pi x=split(root,k);
  72. root=merge(split(x.first,k-1).first,x.second);
  73. }
  74. LL get_pre(int vl){
  75. int k=getrank(root,vl);
  76. pi x=split(root,k);
  77. pi y=split(x.first,k-1);
  78. LL ans=val[y.second];
  79. root=merge(merge(y.first,y.second),x.second);
  80. return ans;
  81. }
  82. LL get_next(int vl){
  83. int k=getrank(root,vl);
  84. pi x=split(root,k);
  85. pi y=split(x.second,1);
  86. LL ans=val[y.first];
  87. root=merge(x.first,merge(y.first,y.second));
  88. return ans;
  89. }
  90. LL query(LL vl){
  91. LL ls=get_pre(vl),rs=get_next(vl);
  92. if(!ls)return rs;
  93. if(!rs)return ls;
  94. if(rs-vl<vl-ls)return rs;
  95. else return ls;
  96. }
  97. }A,B;
  98. LL n,ans=0;
  99. int main(){
  100. A.clear();B.clear();
  101. n=read();
  102. for(LL i=1;i<=n;i++){
  103. LL op=read(),x=read();
  104. switch(op){
  105. case 0:{
  106. if(!B.siz[B.root])A.insert(x);
  107. else{
  108. LL t=B.query(x);B.erase(t);
  109. ans=(ans+abs(t-x))%Mod;
  110. }
  111. break;
  112. }
  113. case 1:{
  114. if(!A.siz[A.root])B.insert(x);
  115. else{
  116. LL t=A.query(x);A.erase(t);
  117. ans=(ans+abs(t-x))%Mod;
  118. }
  119. break;
  120. }
  121. }
  122. }
  123. printf("%lld",ans);
  124. return 0;
  125. }

BZOJ1208 HNOI2004 宠物收养所 【非旋转Treap】的更多相关文章

  1. 2018.07.06 BZOJ1208: HNOI2004宠物收养所(非旋treap)

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...

  2. bzoj1208 [HNOI2004]宠物收养所(STL,Treap)

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5956  Solved: 2317[Submit][Sta ...

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

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

  4. [bzoj1208][HNOI2004][宠物收养所] (平衡树)

    Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...

  5. Bzoj1208 [HNOI2004]宠物收养所

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7457  Solved: 2960 Description 最近,阿Q开了一间宠物收养所.收养所提供两 ...

  6. [bzoj1208][HNOI2004]宠物收养所——splay

    题目大意 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发 ...

  7. bzoj1208: [HNOI2004]宠物收养所 (sbt)

    切傻逼题还能wa那么多次我也是醉了 好啦其实是sbt都不会敲了(一直用神器treap) 重点是研究了下陈大神的删除,以前treap的删除都是直接旋转去删的…… 还是treap大法好&…… 题解 ...

  8. BZOJ1208 [HNOI2004]宠物收养所 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8085803.html 题目传送门 - BZOJ1208 题意概括 有两种数,依次加入. 规则为下: 如果当前剩余 ...

  9. 【set】【Splay】【pb_ds】bzoj1208 [HNOI2004]宠物收养所

    每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案:若为零,就把他放入另一个集合里. 如果是宠物,则同上. 各种平衡树都可过,我蛋疼地用了pb_ds. Code: #incl ...

随机推荐

  1. php获取经纬度

    <?php header("content-type:text/html;charset=utf-8"); function ipjwd() { $getIp=$_SERVE ...

  2. SPA(单页面web应用程序)

    单页web应用(single page web application,SPA),就是只有一张web页面的应用,是加载单个HTML页面并在用户与应用程序交互时动态更新该页面的web应用程序. 浏览器一 ...

  3. Linux系统用户及用户组管理

    目录一.新增/删除用户和用户组二.创建/修改密码三.用户身份切换--su和sudo 一.新增/删除用户和用户组1.用户组 命令 : groupadd 语法 : groupadd [-g GID] gr ...

  4. 字符串与byte[]之间的转换

    一.  编码 同一个字符在不同的编码下会被编成不同长度的编码,比如: ACSII,每个字符对应一个字节,实际上只使用了7位,从00h-7Fh.只能表达128个字符. GB2312,中文的一种编码,每个 ...

  5. 【转】python操作mysql数据库

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...

  6. 运行UART的程序

    1 捎程序的时候,注意,捎入的是norflash,此时的按钮应该在norFlash.2 当捎入成功的时候,开始运行程序时,应该把按钮按回nandflash,因为程序的启动就是在nandflash,他把 ...

  7. java 获取今天,昨天,上个月的日期

    获取今天,昨天,上个月的日期 的方法: Calendar cal = Calendar.getInstance(); //获取今天的日期 cal.setTime(new Date()); int ye ...

  8. Esper——内存计算、事件驱动、SQL支持

    教程简介Esper是一个事件流处理(ESP)和事件关联引擎(CEP的,复杂事件处理).Esper的目标是针对实时事件驱动架构(EDA).当Esper监测到事件流中又符合条件的时间发生时,即可触发Pla ...

  9. vue.js的安装部署+cnpm install 安装过程卡住不动----亲测可用

    1.到Node.js的官网下载node node.js的下载地址,下载完成后,我在d盘新建一个文件夹“node”, 安装到node目录下(安装之后环境变量自动配置了,自己无需再配),比如我的安装路径是 ...

  10. 011——数组(十一)array_merge array_merge_recursive array_change_key_case

    <?php /** */ //array_merge() 将多个数组合并,生成新数组.当键名相同时,后者覆盖前者 /*$array1=array('weburl'=>"bbs.b ...