我是题面

题意简单明了,两种数,如果加入一个数的时候有另一种数还存在,那就取出另一种数中与这个数差值的绝对值最小的将其删除(多个则取较小),并对答案产生它们差值的绝对值的贡献,如果没有另一种数存在,那就先将这个数存下

平衡树裸题,直接两个平衡树维护就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]宠物收养场相关推荐

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

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

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

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

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

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

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

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

  5. [HNOI2004]宠物收养场

    嘟嘟嘟 看完题,思路一秒就出来了:建两棵平衡树,分别维护宠物和领养者.然后就是正常的插入,找前驱后继,删除操作了. 然后旁边的lba巨佬说只用建一棵就行,如果宠物多了就维护宠物,否则维护领养者. 总而 ...

  6. [luogu2286][HNOI2004]宠物收养场【平衡树】

    [传送门] 前言 这一篇题解并不是为了讲什么算法,只是总结一下平衡树在OI考试中的注意事项. 题意简化(给不想看题目的小伙伴们一点福利) 给你两堆数,每一次给你一个数,每一次在另外一堆数中找到这个数的 ...

  7. cogs62 [HNOI2004] 宠物收养所

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

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

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

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

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

最新文章

  1. android开发 BaseAdapter中getView()里的3个参数是什么意思
  2. css 找到隐藏元素个数
  3. 【转载】单片机应用系统断电时的数据保护方法
  4. 使用注解装配Bean
  5. 页面跳转与重定向(之二)
  6. 字节跳动面试官:java架构师培训对比
  7. 20200320:反转字符串中的元音字母(leetcode345)
  8. mysql 拼接符是什么_mysql 字符串拼接
  9. 单行溢出文字省略号显示(HTML、CSS)
  10. python 线程池的研究及实现
  11. 软件验收报告文档模版
  12. 数学建模相关知识梳理
  13. 转载 Camera Link接口
  14. Unity 事件番外篇:UnityEvent
  15. 前端开发和后端开发究竟有什么区别?详细介绍
  16. 计算机六个方面的领域,计算机的应用领域分为哪六个方面
  17. 双人五子棋Python
  18. 华为要开发人工智能手机 魅族新机发布会却被调侃不用开了!
  19. android 西班牙语,Android新增语言的方法(墨西哥的西班牙语)
  20. 基于Python实现图片格式转换的小程序

热门文章

  1. dockerfile安装yum_Docker镜像-基于DockerFile制作yum版nginx镜像
  2. rabbitmq连接java快速入门
  3. 4测试命令_局域网带宽测试工具-iPerf3
  4. oracle通过sid远程登录,oracle怎么捕获用户登录信息,如SID,IP地址等
  5. 127.0.0.1 php,关于php -fpm 出现127.0.0.1:9000已经被占用
  6. 【ruoyi若依】启用HTTPS/SSL后,首页重定向出错
  7. jvm学习笔记(一)
  8. mysql某一列之前加一个球_MySQL作业:三色球,概率题,子查询【诗书画唱】
  9. python中cgi到底是什么_什么是CGI?详细介绍Python CGI编程
  10. php多主写数据,多数据库的配置(从主)