HNOI2004 宠物收养所 解题报告
首先读完这题第一印象,是个裸题,很高兴。其次在打完代码之后,第二印象,很恶心,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 宠物收养所 解题报告的更多相关文章
- 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12030 Solved: 4916 Description ...
- BZOJ 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7514 Solved: 2982[Submit][Sta ...
- bzoj 1208: [HNOI2004]宠物收养所 set
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7328 Solved: 2892[Submit][Sta ...
- 数据结构(set):COGS 62. [HNOI2004] 宠物收养所
62. [HNOI2004] 宠物收养所 ★★★ 输入文件:pet.in 输出文件:pet.out 简单对比时间限制:1 s 内存限制:128 MB 最近,阿Q开了一间宠物收养所.收养 ...
- bzoj1208 [HNOI2004]宠物收养所(STL,Treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5956 Solved: 2317[Submit][Sta ...
- BZOJ 1208: [HNOI2004]宠物收养所(BST)
本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...
- BZOJ_1208_[HNOI2004]宠物收养所_SPLAY
BZOJ_1208_[HNOI2004]宠物收养所_SPLAY Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望 ...
- bzoj 1208: [HNOI2004]宠物收养所 (Treap)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题面: 1208: [HNOI2004]宠物收养所 Time Limit: 10 ...
- 2018.07.06 BZOJ1208: HNOI2004宠物收养所(非旋treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...
随机推荐
- Oracle更改字符集
更改oracle的字符集: sqlplus / as sysdba SQL> shutdown immediate; Database closed. Database dismounted. ...
- php中mail()改用msmtp发送邮件
php中的mail()函数默认调用的是sendmail,这次我将其换成了轻量级的msmtp.在次过程中涉及到:修改配置文件php.ini,创建配置文件msmtprc或(.msmtprc)并修改其权限. ...
- struts2.x中因变量命名错误不被注入到值栈的问题
//I declare... private String aBC="abc"; Then I Alt+Shift+R and S(Generate Getter/Setter) ...
- Bootstrap的响应式,当文字超过div长度,换行问题的处理!
(1)overflow: hiddenoverflow 属性规定当内容溢出元素框时发生的事情.这个属性定义溢出元素内容区的内容会如何处理.hidden 表示内容会被修剪,并且剪掉的内容是不可见的. ( ...
- 找不到Qt5Cored.dll(Release和Debug版连接了不同的库)
Qt5Cored.dll和Qt5Core.dll文件分别用于Qt软件的Debug版和Release版. 通常会有两个Qt5Core.dll文件,分别位于Qti安装目录下的“Qt5.1.0\5.1.0\ ...
- html 知识
<pre name="code" class="python"><pre name="code" class=" ...
- Linux系统编程(24)——信号的生命周期
信号生命周期为从信号发送到信号处理函数的执行完毕. 对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生:信号在进程中 ...
- < IOS > IOS适配,简单的分析解决一下
版权:张英堂 欢迎转载,转载请注明出处. 做的项目很多,一到适配的时候头就大了,IOS6,7的适配,屏幕的适配,当然还有下一步要出4.7屏幕,也要做适配....悲剧的移动端的人员. 怎么做一个通用的适 ...
- 大数据时代的数据存储,非关系型数据库MongoDB(一)
原文地址:http://www.cnblogs.com/mokafamily/p/4076954.html 爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Da ...
- uestc poj2559 秋实大哥去打工
//感觉有必要把这题放博客上待复习 刚刚写解题报告的时候发现自己又不会做这题了 //我不会告诉你这题绝对是命题人抄poj2559 这题使用一个单调递增的栈,栈内存储的元素有两个值,一个高度,一个长度. ...