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开了一间宠物收养所.收养所提供两种服务:收 ...
随机推荐
- Centos6架设GIT服务,windows客户端使用TortoiseGit加载KEYGEN连接GIT服务器
前几天得空,想起前一阵学了GIT还没好好实践,就在虚拟机中安装测试了一下,并简单记录了CENTOS6中GIT安装,ssh-keygen生成,客户端使用TortoiseGit加载KEYGEN连接GIT服 ...
- Xcode 常用快捷键及代码自动排版 二
Xcode常用快捷键,网上找的总结一下,特别是格式化代码 隐藏xcode command+h退出xcode command+q关闭窗口 command+w关闭所有窗口 command+option+w ...
- Xcode6和Xcode5获取app名字
1.在Xcode5下,获取程序名字(app name)的方法为: NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionar ...
- UICollectionView的简单使用和常用代理方法
UICollectionView相对于UITableView有更加自由的布局,做出的界面可变性更大最近开始接触使用UICollectionView,整理了一下常用的代理方法 首先需要先添加UIColl ...
- sql 列设置默认值,语法查询知识点积累
一.修改字段默认值 alter table 表名 drop constraint 约束名字 ------说明:删除表的字段的原有约束 alter table 表名 add constraint 约 ...
- Orchard开源ASP.NET MVC CMS简介
项目简介: Orchard CMS 是一个免费的开放源代码内容管理系统,让用户可在 Microsoft ASP.NET MVC 平台上快速创建网站.它基于灵活的扩展性框架构建,使开发人员和定制人员可通 ...
- 远程复制 scp命令
定义 本机为A,用户名为usera,登录远程主机B的为userb,IP为remote_ip 1. 从B 拷贝文件到A机器 用下面的命令 scp userb@remote_ip:remote_path ...
- SSE2 Intrinsics各函数介绍[转]
SIMD相关头文件包括: //#include <ivec.h>//MMX //#include <fvec.h>//SSE(also include ivec.h) //#i ...
- IIS缺少文件的解决方法
原文 http://cqyccmh.blog.163.com/blog/static/6068134720102211543944/ 今天解决了一个郁闷了很久的问题,之前实在没辙就只能重装系统,因为装 ...
- haproxy nginx 多路径
nginx 多路径: location / { root /t/deploy/zjdev/deployedApps/zjzc-web-frontEnd/; index index.html index ...