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开了一间宠物收养所.收养所提供两种服务:收 ...
随机推荐
- VS 2003 无法打开Web项目,位于服务器“http:10.45.4.70:8080”上的项目不存在
解决方法: 用记事本打开*.sln文件更改第2行 改成正确的虚拟目录 出现这种情况往往是从一台机器搬到另一台机器造成的虚拟路径名字不同
- C#操作Excel总结
0. 导入命名空间: 1 2 3 4 using Microsoft.Office.Core; using Microsoft.Office.Interop.Excel; using System. ...
- (转)Source vs Binary Disadvantages & Advantages of each!
原链接:http://www.linuxforums.org/forum/newbie/26472-source-vs-binary-disadvantages-advantages-each.htm ...
- C++程序中不同变量、函数在内存中内存中的分布情况
一.一个C++编译的程序占用的内存分为以下几个部分 1.栈区:由编译器自动分配 存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈. 2.堆区:一般由程序员分配释放,若程序员不释放,程序结 ...
- (原+转)Ubuntu下安装understand及在启动器中增加快捷方式
参考网址: http://www.xuebuyuan.com/1353431.html http://www.2cto.com/os/201309/242543.html http://my.osch ...
- UnSupported Encoding错误
学习struts2的时候碰到tomcat报错:org.apache.jasper.JasperException: Unsupported encoding: UTF-8,原因是jsp文件中的pag ...
- sql server中主键列的插入问题
仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'dbo.t_test'中的标识列指定显式值. SET IDENTITY_INSERT dbo.t_test ON ,'c' ...
- C语言编译过程简介
刚开始接触编程的时候,只知道照书敲敲代码,一直都不知道为什么在windows平台下代码经过鼠标那样点击几下,程序的结果就会在那个黑色的屏幕上.现在找了个机会将C语言的编译原理做一下小小的总结,这样也能 ...
- STC10F10XE定时器中断输出10KHz的方波程序
//咱做硬件的也动手做点测试程序,为了测试新做的电机驱动板,找了个51的板子当10K信号发生器测试IGBT开关延时时间. #include <STC_NEW_8051.H>#include ...
- EF 请求数据是缓存 求大神解释
// //AliexpressEntities MyaliexpressEntities 为了事物一致性 在别的方法里面传过来的 实质还是 ( AliexpressEntities aliexpre ...