题目链接

[HNOI2004]宠物收养所

题解

这基本上就是一个裸的treap,听说set可以秒此题,但是本着练习treap的思想我还是手打了一份平衡树。首先人和宠物是一样的,只需要判断一下现在收养所里面装的是什么,来东西了,一样就直接insert,不一样就找一下前驱后继判一下选哪个然后把那个remove了,每次判一下树是否为空,空了就换成当前来的东西的类型。应该比较简单codevs上都是钻石(我猜是因为set可以做就很简单了)

代码

我是拿的板子所以多写了rank和kth

#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
struct Node{int v,r,s;Node *ch[2];Node(int v):v(v){r=rand();s=1;ch[0]=ch[1]=NULL;}int cmp(int x){if(v==x) return -1;return v>x?0:1;}void maintain(){s=1;if(ch[0]!=NULL) s+=ch[0]->s;if(ch[1]!=NULL) s+=ch[1]->s;}
};void rotate(Node* &p,int c)
{Node *t=p->ch[c^1];p->ch[c^1]=t->ch[c];t->ch[c]=p;p->maintain();t->maintain();p=t;return ;
}void insert(Node* &p,int x)
{if(p==NULL){p=new Node(x);return ;}int tcmp=p->cmp(x);//int tcmpa=(x>p->v ? 1:0) 有重复的时候用这一句 insert(p->ch[tcmp],x);if(p->ch[tcmp]->r > p->r) rotate(p,tcmp^1);p->maintain();
}void remove(Node* &p,const int x)
{int tcmp=p->cmp(x); if(tcmp==-1){if(p->ch[0]==NULL) p=p->ch[1];//**remove(p->ch[1],x)else if(p->ch[1]==NULL) p=p->ch[0];//**remove(p->ch[0],x)else{int tmp=(p->ch[0]->r > p->ch[1]->r ? 1:0);rotate(p,tmp);remove(p->ch[tmp],x);//**p=p->ch[tmp];}}else remove(p->ch[tcmp],x);if(p!=NULL) p->maintain();//** 漏了一句 return ;
}bool find(Node* p,const int x)
{while(p!=NULL){int tcmp=p->cmp(x);if(tcmp==-1) return true;p=p->ch[tcmp];}return false;
}int kth(Node* p,int x)
{if(p==NULL||x<0||x>p->s)return -1;int d=(p->ch[1]==NULL?0:p->ch[1]->s);if(x==d+1) return p->v;if(x<=d) return kth(p->ch[1],x);return kth(p->ch[0],x-d-1);
} int rank(Node* p,const int x)
{int ret=1;while(p!=NULL){int tcmp=p->cmp(x),d=(p->ch[1]==NULL?0:p->ch[1]->s);if(tcmp==-1) return ret+d;if(tcmp==0) ret=ret+1+d;else ret++;p=p->ch[tcmp];}return ret;
}int pre(Node* p,const int x)
{int ret=0;while(p!=NULL){int tcmp=p->cmp(x);if(tcmp==-1) return x;if(tcmp) ret=max(ret,p->v);p=p->ch[tcmp];}return ret;
}const int INF=(1<<30);
int last(Node* p,const int x)
{int ret=INF;while(p!=NULL){int tcmp=p->cmp(x);if(tcmp==-1) return x;if(!tcmp) ret=min(ret,p->v);p=p->ch[tcmp];}return ret;
}inline int read()
{int ret=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0';return ret;
}const int MOD=1000000;
int main()
{srand(0);Node *root=NULL;int kind,n,sum=0;cin>>n;for(int i=1,ins,x;i<=n;i++){ins=read();x=read();if(root==NULL) kind=ins,insert(root,x);else if(ins==kind) insert(root,x);else{int PRE=pre(root,x);int LAST=last(root,x);int d=INF,wh;if(PRE&&abs(PRE-x)<d) d=abs(PRE-x),wh=PRE;if(LAST!=INF&&abs(LAST-x)<d) d=abs(LAST-x),wh=LAST;sum=(sum+d)%MOD;remove(root,wh);}}cout<<sum;return 0;
}

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

  1. cogs62 [HNOI2004] 宠物收养所

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

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

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

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

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

  4. BZOJ 1208: [HNOI2004]宠物收养所 (Treap)

    BZOJ 1208: [HNOI2004]宠物收养所 题目概述: 有一家宠物收养所,提供两种服务:收养主人遗弃的宠物和让新主人领养宠物. 宠物收养所中总是会有两种情况发生:遗弃宠物过多和领养宠物人过多 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 二次开发photoshop_Photoshop 101:Web开发人员简介
  2. webrtc简单案例——音视频采集和播放
  3. 出国?上研?工作?回家种田?(二) 专业与上研相关问题
  4. 虚拟机环境下Centos6.5如何上网
  5. UVA434 Matty‘s Blocks【贪心】
  6. [LeetCode]Letter Combinations of a Phone Number
  7. 序列化和反序列化的概念
  8. Spring Boot整合模板引擎freemarker
  9. 第k小元素——分治法
  10. 微信小程序获取数据并展示
  11. Python人眼视线追踪系统
  12. C语言打印三角形,倒三角形,打印沙漏图形
  13. ZYNQ sd卡启动失败,mmc0: error -84 whilst initialising SD card, SD卡只读,mmcblk0: mmc0:0001 SD 8 GiB (ro)
  14. Beats: 使用 Filebeat 进行日志结构化 - Python
  15. 宝讯网捷:拼多多主图怎么加文字?
  16. WINDOWS远程连接显示“请稍后”
  17. 火车头采集翻页内容_火车头采集:内容替换支持[参数],标签
  18. 权限模型 DAC ACL RBAC ABAC
  19. windows 命令行ssh + Xming打开虚拟机的图形界面应用
  20. 爱德泰科普 | 单模光纤和多模光纤小知识

热门文章

  1. 我开发PLC数据采集、录波软件PLC-Recorder的心路历程
  2. ae合成设置快捷键_(精品)AE从小白到大神之路(一)-AE入门
  3. 重装win10系统(家庭版和专业版)
  4. 超简单的QFN封装芯片的手工焊接方法,先收藏
  5. 云和人工智烈日当头,华为HPC解决方案如何应对?
  6. spark idea报错:json standard allows only one-top level
  7. uni-app uni.request简单封装(请求头配置及response处理)
  8. 人人都能写游戏系列(三)Unity 3D平衡球游戏
  9. 关于坐标系(大地坐标、平面坐标、投影、北京54、西安80、WGS84)的一些理解
  10. 什么是power bi