P2286 [HNOI2004]宠物收养场
我是题面
题意简单明了,两种数,如果加入一个数的时候有另一种数还存在,那就取出另一种数中与这个数差值的绝对值最小的将其删除(多个则取较小),并对答案产生它们差值的绝对值的贡献,如果没有另一种数存在,那就先将这个数存下
平衡树裸题,直接两个平衡树维护就ok了,一个也能维护,稍麻烦一点
线段树好像也可做,我没写,应该不难
我写的是Splay,把Splay用结构体封装好,开两个Splay异常好写
下面放代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc getchar
#define maxn 80005
#define mo 1000000
using namespace std;inline ll read(){ll a=0;int f=0;char p=gc();while(!isdigit(p)){f|=p=='-';p=gc();}while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}return f?-a:a;
}int n;ll ans;struct ahaha{ //Splay的结构体struct ahaha1{int sz,cnt,ch[2];ll v;}t[maxn];int rt,tot,f[maxn];#define lc t[i].ch[0]#define rc t[i].ch[1]inline int get(int i){return i==t[f[i]].ch[1];}inline void update(int i){t[i].sz=t[i].cnt+t[lc].sz+t[rc].sz;}inline void del(int i){t[i].v=t[i].sz=t[i].cnt=f[i]=0;}inline int newnode(ll v){int i=++tot;t[i].sz=t[i].cnt=1;t[i].v=v;return i;}inline void rotate(int x){int y=f[x],z=f[y],k=get(x);f[x]=z;f[t[x].ch[k^1]]=y;f[y]=x;if(z)t[z].ch[y==t[z].ch[1]]=x;t[y].ch[k]=t[x].ch[k^1];t[x].ch[k^1]=y;update(y);update(x);}void Splay(int x){for(int y=f[x];f[x];rotate(x),y=f[x]){if(f[y])rotate(get(x)==get(y)?y:x);rt=x;}}void insert(ll v){int i=rt,k;if(!rt){rt=newnode(v);return;}while(1){k=v>t[i].v;if(v==t[i].v){++t[i].sz;++t[i].cnt;Splay(i);return;}if(!t[i].ch[k]){t[i].ch[k]=newnode(v);f[t[i].ch[k]]=i;Splay(t[i].ch[k]);return;}i=t[i].ch[k];}}void find(ll v){int i=rt;while(1){if(v<t[i].v){i=lc;if(!i)return;}else{if(!rc||v==t[i].v){Splay(i);return ;}i=rc;}}}inline void earase(ll v){find(v);int old=rt,i=rt;if(t[rt].cnt!=1){--t[rt].cnt;return;}if(t[rt].sz==1){del(rt);rt=0;return;}if(!lc){rt=rc;f[rt]=0;del(old);return;}if(!rc){rt=lc;f[rt]=0;del(old);return;}i=lc;while(rc)i=rc;Splay(i);t[rt].ch[1]=t[old].ch[1];f[t[rt].ch[1]]=rt;del(old);update(rt);}ll pre(ll v){int i=rt;ll maxa=-1;while(i){if(t[i].v==v)return v;if(t[i].v<v){maxa=max(maxa,t[i].v);i=rc;}else i=lc;}return maxa;}ll next(ll v){int i=rt;ll mina=2147483649;while(i){if(t[i].v==v)return v;if(t[i].v>v){mina=min(mina,t[i].v);i=lc;}else i=rc;}return mina;}
}t1,t2;inline void solve_1(){ll v=read();if(!t2.rt) //如果没有另一种数,先存起来t1.insert(v);else{ll pre=t2.pre(v),next=t2.next(v); //查询前后缀,没有前缀则前缀为-1,没有后缀则后缀为2147483649if(pre==-1){ans=(ans+next-v)%mo;t2.earase(next);return;}if(next==2147483649){ans=(ans+v-pre)%mo;t2.earase(pre);return;}if(v-pre<=next-v){ //按照题意取较小,然后删除就可以了ans=(ans+v-pre)%mo;t2.earase(pre);return;}else{ans=(ans+next-v)%mo;t2.earase(next);return;}}
}
inline void solve_2(){ //同上ll v=read();if(!t1.rt)t2.insert(v);else{ll pre=t1.pre(v),next=t1.next(v);if(pre==-1){ans=(ans+next-v)%mo;t1.earase(next);return;}if(next==2147483649){ans=(ans+v-pre)%mo;t1.earase(pre);return;}if(v-pre<=next-v){ans=(ans+v-pre)%mo;t1.earase(pre);return;}else{ans=(ans+next-v)%mo;t1.earase(next);return;}}
}int main(){n=read();while(n--){int zz=read();switch(zz){case 0:solve_1();break;case 1:solve_2();break;}}printf("%lld\n",ans);return 0;
}
不要抄代码哦
转载于:https://www.cnblogs.com/hanruyun/p/10248973.html
P2286 [HNOI2004]宠物收养场相关推荐
- 洛谷P2286 [HNOI2004]宠物收养场
题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...
- 洛谷 P2286 [HNOI2004]宠物收养场
题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...
- 洛谷P2286 [HNOI2004]宠物收养所 [STL,平衡树]
题目传送门 宠物收养所 题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的 ...
- BZOJ1208[HNOI2004]宠物收养场——treap
凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领 ...
- [HNOI2004]宠物收养场
嘟嘟嘟 看完题,思路一秒就出来了:建两棵平衡树,分别维护宠物和领养者.然后就是正常的插入,找前驱后继,删除操作了. 然后旁边的lba巨佬说只用建一棵就行,如果宠物多了就维护宠物,否则维护领养者. 总而 ...
- [luogu2286][HNOI2004]宠物收养场【平衡树】
[传送门] 前言 这一篇题解并不是为了讲什么算法,只是总结一下平衡树在OI考试中的注意事项. 题意简化(给不想看题目的小伙伴们一点福利) 给你两堆数,每一次给你一个数,每一次在另外一堆数中找到这个数的 ...
- cogs62 [HNOI2004] 宠物收养所
cogs62 [HNOI2004] 宠物收养所 啦啦啦啦 不维护区间的平衡树题都是树状数组+二分练手题! 不会的参考我的普通平衡树的多种神奇解法之BIT+二分答案 // It is made by X ...
- BZOJ 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 7684 Solved: 3042 [Submit][S ...
- 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 1.用Treap树写: 只需要三个操作,插入,删除,查找(同时找出其前继后继): View Code /************************** ...
最新文章
- android开发 BaseAdapter中getView()里的3个参数是什么意思
- css 找到隐藏元素个数
- 【转载】单片机应用系统断电时的数据保护方法
- 使用注解装配Bean
- 页面跳转与重定向(之二)
- 字节跳动面试官:java架构师培训对比
- 20200320:反转字符串中的元音字母(leetcode345)
- mysql 拼接符是什么_mysql 字符串拼接
- 单行溢出文字省略号显示(HTML、CSS)
- python 线程池的研究及实现
- 软件验收报告文档模版
- 数学建模相关知识梳理
- 转载 Camera Link接口
- Unity 事件番外篇:UnityEvent
- 前端开发和后端开发究竟有什么区别?详细介绍
- 计算机六个方面的领域,计算机的应用领域分为哪六个方面
- 双人五子棋Python
- 华为要开发人工智能手机 魅族新机发布会却被调侃不用开了!
- android 西班牙语,Android新增语言的方法(墨西哥的西班牙语)
- 基于Python实现图片格式转换的小程序
热门文章
- dockerfile安装yum_Docker镜像-基于DockerFile制作yum版nginx镜像
- rabbitmq连接java快速入门
- 4测试命令_局域网带宽测试工具-iPerf3
- oracle通过sid远程登录,oracle怎么捕获用户登录信息,如SID,IP地址等
- 127.0.0.1 php,关于php -fpm 出现127.0.0.1:9000已经被占用
- 【ruoyi若依】启用HTTPS/SSL后,首页重定向出错
- jvm学习笔记(一)
- mysql某一列之前加一个球_MySQL作业:三色球,概率题,子查询【诗书画唱】
- python中cgi到底是什么_什么是CGI?详细介绍Python CGI编程
- php多主写数据,多数据库的配置(从主)