首先读完这题第一印象,是个裸题,很高兴。其次在打完代码之后,第二印象,很恶心,Treap的代码太长了,我今天下午敲了三遍,手都麻了。

  废话不多说,正题。其实这个题不难,有几个点是很好的,首先,他的a值没有重复的,这就保证了你找前驱和后继的正确性,再次,没有宠物和人会同时在收养所内,那么你找的前驱和后继就不用判断是人还是动物。再次,就是AC了。

  这个题一开始全WA,是因为没有注意前驱和后继不能为0的情况,导致自己领养自己或者自己被自己领养的情况出现,改了之后AC。

  Treap的裸题,建议码一下。

  直接上代码。

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib> using namespace std;
const int maxn = + ; int N,flag,temp;
int Ans,size,root;
int Out = ;
int ani_cnt = ,er_cnt = ;
int pre,bac; struct data{
int l,r,w,v,size,rnd;
}tr[maxn];
void update(int k){
tr[k].size = tr[tr[k].l].size + tr[tr[k].r].size + tr[k].w;
}
void rturn(int &k){
int t = tr[k].l;tr[k].l = tr[t].r;tr[t].r = k;
tr[t].size = tr[k].size;update(k);k = t;
}
void lturn(int &k){
int t = tr[k].r;tr[k].r = tr[t].l;tr[t].l = k;
tr[t].size = tr[k].size;update(k);k = t;
}
void insert(int &k,int x){
if(k == ){
size ++;k = size;
tr[k].w = tr[k].size = ;
tr[k].v = x;tr[k].rnd = rand();
return;
}
tr[k].size ++;
if(tr[k].v == x){
tr[k].w ++;
}
else if(x < tr[k].v){
insert(tr[k].l,x);
if(tr[tr[k].l].rnd < tr[k].rnd)
rturn(k);
}
else {
insert(tr[k].r,x);
if(tr[tr[k].r].rnd < tr[k].rnd)
lturn(k);
}
}
void del(int &k,int x){
if(k == )
return;
if(tr[k].v == x){
if(tr[k].w > ){
tr[k].w --;tr[k].size --;
return;
}
if(tr[k].r*tr[k].l == )
k = tr[k].r + tr[k].l;
else if(tr[tr[k].l].rnd < tr[tr[k].r].rnd)
rturn(k),del(k,x);
else
lturn(k),del(k,x);
}
else if(x > tr[k].v)
tr[k].size --,del(tr[k].r,x);
else
tr[k].size --,del(tr[k].l,x);
}
int query_rank(int k,int x){
if(k == )
return ;
if(x == tr[k].v)
return tr[tr[k].l].size + ;
else if(x > tr[k].v)
return tr[tr[k].l].size + tr[k].w + query_rank(tr[k].r,x);
else return query_rank(tr[k].l,x);
}
int query_num(int k,int x){
if(k == )
return ;
if(x <= tr[tr[k].l].size)
return query_num(tr[k].l,x);
else if(x > tr[tr[k].l].size + tr[k].w)
return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w);
else return tr[k].v;
}
void query_pre(int k,int x){
if(k == )
return;
if(x > tr[k].v){
Ans = k;query_pre(tr[k].r,x);
}
else query_pre(tr[k].l,x);
}
void query_sub(int k,int x){
if(k == )
return;
if(x < tr[k].v){
Ans = k;query_sub(tr[k].l,x);
}
else query_sub(tr[k].r,x);
} int main(){
freopen("pet.in","r",stdin);
freopen("pet.out","w",stdout);
scanf("%d",&N);
for(int i = ;i <= N;++ i){
scanf("%d%d",&flag,&temp);
if(!flag){
insert(root,temp);
ani_cnt ++;
if(er_cnt >= ani_cnt){//如果人多动物少,那么这个动物立刻被领养
query_pre(root,temp);pre = tr[Ans].v;Ans = ;
query_sub(root,temp);bac = tr[Ans].v;Ans = ;
if(pre == bac){
Out += abs(pre-temp);
del(root,pre);del(root,temp);
}
else{
if(temp-pre < bac-temp){
if(pre){
Out += temp-pre;
del(root,pre);del(root,temp);
}
else{
Out += bac-temp;
del(root,bac);del(root,temp);
} }
else{
if(bac){
Out += bac-temp;
del(root,bac);del(root,temp);
}
else{
Out += temp-pre;
del(root,pre);del(root,temp);
}
}
}
--er_cnt;--ani_cnt;
}
}
else{
insert(root,temp);
er_cnt ++;
if(ani_cnt >= er_cnt){//如果动物多人少,那么这个人立刻领养一个动物
query_pre(root,temp);pre = tr[Ans].v;Ans = ;
query_sub(root,temp);bac = tr[Ans].v;Ans = ;
if(pre == bac){
Out += abs(pre-temp);
del(root,pre);del(root,temp);
}
else{
if(temp-pre < bac-temp){
if(pre){
Out += temp-pre;
del(root,pre);del(root,temp);
}
else{
Out += bac-temp;
del(root,bac);del(root,temp);
}
}
else{
if(bac){
Out += bac-temp;
del(root,bac);del(root,temp);
}
else{
Out += temp-pre;
del(root,pre);del(root,temp);
}
}
}
--er_cnt;--ani_cnt;
}
}
Out %= ;
}
printf("%d",Out%);
fclose(stdin);fclose(stdout);
return ;
}

HNOI2004 宠物收养所 解题报告的更多相关文章

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

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12030 Solved: 4916 Description ...

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

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

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

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

  4. 数据结构(set):COGS 62. [HNOI2004] 宠物收养所

    62. [HNOI2004] 宠物收养所 ★★★   输入文件:pet.in   输出文件:pet.out   简单对比时间限制:1 s   内存限制:128 MB 最近,阿Q开了一间宠物收养所.收养 ...

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

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

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

    本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...

  7. BZOJ_1208_[HNOI2004]宠物收养所_SPLAY

    BZOJ_1208_[HNOI2004]宠物收养所_SPLAY Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望 ...

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

    链接:  https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题面: 1208: [HNOI2004]宠物收养所 Time Limit: 10 ...

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

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

随机推荐

  1. commit后数据库干的工作

    用户提交commit后,数据库干的工作有: 1,oracle为用户的transaction生成一个SCN号. 2,LGWR把redo buffer中的数据写入到redo log file,同时把SCN ...

  2. (原创)ubuntu 12.04 安装 apache ant

    1. go to the websie to download the newest version of ant (search google by "Apache Ant"). ...

  3. (原)Understand中查看函数调用关系

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/4994551.html 1. 选中某函数,如_tmain,右键“Graphical Views——Cal ...

  4. Linux的用户和用户组

    /etc/group   文件存储了所有的用户和用户组信息 存储格式: 组名:组密码占位符:组编号:组中所有用户 root:x:0: mail:x:12:postfix ... 说明:   root: ...

  5. android的编译和运行过程深入分析

    android的编译和运行过程深入分析 作者: 字体:[增加 减小] 类型:转载 首先来看一下使用Java语言编写的Android应用程序从源码到安装包的整个过程,此过程对了解android的编译和运 ...

  6. GitLab CI

    GitLab CI持续集成配置方案   目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 Git ...

  7. 老了,问题定位难了,xml编码解析

    同样一个程序,在A机器好用,在B机器不好用,怀疑过jdk版本位数问题,怀疑过其他. 最后,突然发现出错的全是xml中文,想到是不是编码问题,一看环境变量果真一个gbk,一个utf-8,再一看 程序,没 ...

  8. 将窗体显示在 PageControl 上

    var AWinControl:TPageControl; begin AWinControl := PageControl1; if frmAbout = nil then Exit; frmAbo ...

  9. Linux下程序崩溃,ulimit,coredump,gdbserver

    操作系统:Ubuntu10.04 前言:    在程序崩溃后,如何快速定位问题.    以下方法适用于开发调试阶段,不太适用成品.    本文着眼于嵌入式,PC方面更简单.    核心:gdbserv ...

  10. 【LeetCode练习题】Pow(x, n)

    Pow(x, n) Implement pow(x, n). 计算x的n次方. 解题思路: 考虑到n的值会很大,而且可为正可为负可为0,所以掉渣天的方法就是用递归了. 对了,这题也在<剑指off ...