题目

平衡树的简单应用,删除,求前驱和后继。

一般来说,会建两颗线段树,但事实上,题目可得,同一时间内,只会有宠物或人,所以,只要一颗就够了。

#include<bits/stdc++.h>
#define N 80000
#define mod 1000000
using namespace std;
int ch[N+1][2],siz[N+1],cnt[N+1],f[N+1],key[N+1],sz,rt;
int n,opt,x,ans,tmp1,tmp2,now,flag,num,mi,id;
inline char nc()
{static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{int x=0;char c=nc();while(c<'0'||c>'9')c=nc();while(c<='9'&&c>='0')x=x*10+c-'0',c=nc();return x;
}
inline void clear(int x)
{ch[x][0]=ch[x][1]=f[x]=key[x]=cnt[x]=siz[x]=0;
}
inline int get(int x)
{return ch[f[x]][1]==x;
}
inline void update(int x)
{if(!x)return;siz[x]=cnt[x];if(!ch[x][0])siz[x]+=siz[ch[x][0]];if(!ch[x][1])siz[x]+=siz[ch[x][1]];
}
inline void rotate(int x)
{int old=f[x],oldf=f[old],which=get(x);ch[old][which]=ch[x][which^1],f[ch[old][which]]=old;f[old]=x,ch[x][which^1]=old;f[x]=oldf;if(oldf)ch[oldf][ch[oldf][1]==old]=x;update(old),update(x);
}
inline void splay(int x)
{for(int fa;fa=f[x];rotate(x))if(f[fa])rotate(get(x)==get(fa)?fa:x);rt=x;
}
inline void insert(int x)
{if(rt==0){sz++,clear(sz),key[sz]=x,cnt[sz]=1,siz[sz]=1,rt=sz;return;}int now=rt,fa=0;while(true){if(key[now]==x){cnt[now]++;update(now),update(fa);splay(now);return;}fa=now;now=ch[now][key[now]<x];if(now)continue;sz++;clear(sz);key[sz]=x,cnt[sz]=1,siz[sz]=1;f[sz]=fa;ch[fa][key[fa]<x]=sz;update(fa);splay(sz);return;}
}
inline int pre()
{int now=ch[rt][0];while(ch[now][1])now=ch[now][1];return now;
}
inline int suf()
{int now=ch[rt][1];while(ch[now][0])now=ch[now][0];return now;
}
inline int find(int x)
{int now=rt,ans=0;while(true){if(x<key[now])now=ch[now][0];else{ans+=(ch[now][0]?siz[ch[now][0]]:0);if(x==key[now]){splay(now);return ans+1;}ans+=cnt[now];now=ch[now][1];}}
}
inline int findx(int x)
{int now=rt;while(true){if(ch[now][0]&&x<=siz[ch[now][0]])now=ch[now][0];else{int tmp=(ch[now][0]?siz[ch[now][0]]:0)+cnt[now];if(x<=tmp)return key[now];x-=tmp,now=ch[now][1];}}
}
inline void del(int x)
{int tmp=find(x);if(cnt[rt]>1){cnt[rt]--,update(rt);return;}if(!ch[rt][0]&&!ch[rt][1]){clear(rt),rt=0;return;}if(!ch[rt][0]){int oldrt=rt;rt=ch[rt][1],f[rt]=0;clear(oldrt);return;}if(!ch[rt][1]){int oldrt=rt;rt=ch[rt][0],f[rt]=0;clear(oldrt);return;}int oldrt=rt,leftbig=pre();splay(leftbig);ch[rt][1]=ch[oldrt][1];f[ch[oldrt][1]]=rt;clear(oldrt);return;
}
int main()
{//freopen("in.txt","r",stdin);n=read();now=read(),x=read();insert(x);num=1;for(int i=2;i<=n;i++){opt=read(),x=read();if(opt!=now){flag=true;now=opt;}if(!flag)insert(x),num++;else{if(num==0){flag=false;insert(x);num++;continue;}mi=~0u>>1;insert(x);tmp1=pre(),tmp2=suf();if(tmp1&&abs(x-key[tmp1])<mi)mi=abs(x-key[tmp1]),id=tmp1;if(tmp2&&abs(x-key[tmp2])<mi)mi=abs(x-key[tmp2]),id=tmp2;ans=(ans+mi)%mod;del(x);del(key[id]);num--;}}cout<<ans;return 0;
}


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

  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]宠物收养所

    本题考查的是数据结构,很基础的平衡树就可以解决,所以本题c++的同学可以用stl库开挂直接过的,而像我这种暂时不愿转c++的弱菜只好手写平衡树了. 这题用splay做的话难度不是很大,一些基本的操作就 ...

  4. bzoj1208: [HNOI2004]宠物收养所 SBTSplay

    初次写SBT.....感觉sbt跟线段树一样,多写写就熟了. #include <iostream> #include <algorithm> #include <cst ...

  5. cogs62 [HNOI2004] 宠物收养所

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 小程序下的兼容性问题
  2. (Q 2)netstat命令 检测TCP/IP 网络链接是否存在异常
  3. SAP Cloud for Customer的后台作业
  4. zoj 3511 Cake Robbery(线段树)
  5. mysql long类型_MySQL数据类型笔记
  6. 《Algorithms》—— 下压(LIFO)栈(能够动态调整数组大小的实现)
  7. 如何在 Web 开发中找到第一份工作?
  8. PHP 二维数组根据某个字段排序
  9. max点缓存烘焙帧_3DMAX怎么进行点缓存?
  10. oracle dbv验证,【案例】Oracle数据库verify验证块报错4 dbv报错代码:6101解决办法...
  11. 人机交互中的情境认知
  12. 模型解释器-LIME
  13. dof景深matlab,景深(DOF)
  14. bat批处理文件夹内文件名的提取
  15. BigDecimal的ROUND_DOWN()中的坑
  16. 使用用软通牒(UltraISO)制作U盘启动盘
  17. 记一次safari浏览器正则表达式兼容问题
  18. RK G87机械键盘使用指南
  19. ShuffleNetV2-Yolov5 更轻更快易于部署的yolov5
  20. 上次被 ArrayList 锤了一拳后,LinkedList 很不服气,做出最后一击

热门文章

  1. java+svm多分类器_svm多分类的java源码
  2. 双非计算机硕士何去何从(2)
  3. ubuntu unity 3D桌面效果
  4. 程序员租房福利! 最新 2018年上海公积金提取 租房提取
  5. 热浪寒浪统计在python上的实现
  6. 前端视觉测试工具:Applitools Eyes
  7. 【笔记】程序性能优化28个策略原则
  8. 教师评计算机课缺点及建议,评课用语优缺点及建议
  9. HHUOJ 1019 Friendship of Mouse(水题)
  10. 原生js实现横向 tab 栏切换,选中项自动滚动居中