洛谷P2286 [HNOI2004]宠物收养场

题目描述

凡凡开了一间宠物收养场。收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。

每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养场的宠物一个特点值。这样他就能够很方便的处理整个领养宠物的过程了,宠物收养场总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少。

被遗弃的宠物过多时,假若到来一个领养者,这个领养者希望领养的宠物的特点值为a,那么它将会领养一只目前未被领养的宠物中特点值最接近a的一只宠物。(任何两只宠物的特点值都不可能是相同的,任何两个领养者的希望领养宠物的特点值也不可能是一样的)如果有两只满足要求的宠物,即存在两只宠物他们的特点值分别为a-b和a+b,那么领养者将会领养特点值为a-b的那只宠物。

收养宠物的人过多,假若到来一只被收养的宠物,那么哪个领养者能够领养它呢?能够领养它的领养者,是那个希望被领养宠物的特点值最接近该宠物特点值的领养者,如果该宠物的特点值为a,存在两个领养者他们希望领养宠物的特点值分别为a-b和a+b,那么特点值为a-b的那个领养者将成功领养该宠物。

一个领养者领养了一个特点值为a的宠物,而它本身希望领养的宠物的特点值为b,那么这个领养者的不满意程度为abs(a-b)。

你得到了一年当中,领养者和被收养宠物到来收养所的情况,请你计算所有收养了宠物的领养者的不满意程度的总和。这一年初始时,收养所里面既没有宠物,也没有领养者。

输入输出格式

输入格式:

 

第一行为一个正整数n,n<=80000,表示一年当中来到收养场的宠物和领养者的总数。接下来的n行,按到来时间的先后顺序描述了一年当中来到收养场的宠物和领养者的情况。每行有两个正整数a, b,其中a=0表示宠物,a=1表示领养者,b表示宠物的特点值或是领养者希望领养宠物的特点值。(同一时间呆在收养所中的,要么全是宠物,要么全是领养者,这些宠物和领养者的个数不会超过10000个)

 

输出格式:

 

仅有一个正整数,表示一年当中所有收养了宠物的领养者的不满意程度的总和mod 1000000以后的结果。

 

输入输出样例

输入样例#1: 复制
5                  
0 2                      
0 4                         
1 3
1 2
1 5
输出样例#1: 复制
3
注:abs(3-2) + abs(2-4)=3,
最后一个领养者没有宠物可以领养。

 

 

哎呀一不小心拿了个rank1还比第二快9倍呢:joy:

这道题目比较简单

请选择一种数据结构,

支持插入、删除、求前驱后继

splay裸题

有一个小技巧:

在求前驱后继的时候增加两个哨兵节点

这样就不会加爆了

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int MAXN=1e6+10;
const int mod=1000000;
const int INF=2*0x7ffffff;
inline char nc()
{static char buf[MAXN],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin))?EOF:*p1++;
}
inline int read()
{char c=nc();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}while(c>='0'&&c<='9'){x=x*10+c-'0',c=nc();}return x*f;
}
int PetNum;
#define root tree[0].ch[1]
struct node
{int v,fa,ch[2],rec;
}tree[MAXN];int tot,point;
bool ident(int x)
{return tree[tree[x].fa].ch[0]==x?0:1;
}
void connect(int x,int fa,int how)
{tree[x].fa=fa;tree[fa].ch[how]=x;
}
void rotate(int x)
{int Y=tree[x].fa;int R=tree[Y].fa;int Yson=ident(x);int Rson=ident(Y);int B=tree[x].ch[Yson^1];connect(B,Y,Yson);connect(Y,x,Yson^1);connect(x,R,Rson);
}
void splay(int x,int to)
{to=tree[to].fa;while(tree[x].fa!=to){if(tree[tree[x].fa].fa==to) rotate(x);else if(ident(x)==ident(tree[x].fa)) rotate(tree[x].fa),rotate(x);else rotate(x),rotate(x);}
}
void newpoint(int x,int fa)
{tree[++tot].v=x;tree[tot].fa=fa;tree[tot].rec=1;
}
void insert(int x)
{point++;if(tot==0){newpoint(x,0);root=tot;return ;}int now=root;while(1){if(tree[now].v==x){tree[now].rec++;splay(now,root);return ;}int nxt=x<tree[now].v?0:1;if(!tree[now].ch[nxt]){newpoint(x,now);tree[now].ch[nxt]=tot;splay(tot,root);return ;}now=tree[now].ch[nxt];}
}
int lower(int x)
{int ans=-INF;int now=root;while(now){if(tree[now].v<x)   ans=max(ans,tree[now].v);int nxt=x<tree[now].v?0:1;if(tree[now].ch[nxt]==0)    return ans;now=tree[now].ch[nxt];}return ans;
}
int upper(int x)
{int ans=INF;int now=root;while(now){if(tree[now].v>x)   ans=min(ans,tree[now].v);int nxt=x<tree[now].v?0:1;if(tree[now].ch[nxt]==0)    return ans;now=tree[now].ch[nxt];}
}
int find(int x)
{int now=root;while(1){if(tree[now].v==x)  {splay(now,root);return now;}int nxt=x<tree[now].v?0:1;if(!tree[now].ch[nxt])    return 0;now=tree[now].ch[nxt];}
}
void des(int x)
{tree[x].ch[0]=tree[x].ch[1]=tree[x].fa=tree[x].rec=tree[x].v=0;if(x==tot) tot--;
}
void dele(int x)
{int deal=find(x);if(!deal)   return ;point--;if(tree[deal].rec>1){tree[deal].rec--;return ;}if(!tree[deal].ch[0]) root=tree[deal].ch[1],tree[root].fa=0;else{int mxson=tree[deal].ch[0];while(tree[mxson].ch[1])    mxson=tree[mxson].ch[1];splay(mxson,tree[deal].ch[0]);connect(tree[deal].ch[1],mxson,1);connect(mxson,0,1);}des(deal);
}
int main()
{#ifdef WIN32freopen("a.in","r",stdin);#else#endifint n=read(),ans=0;while(n--){int opt=read(),x=read();if(PetNum==0)    {insert(x);if(opt==0)    PetNum++;else PetNum--;}else if(PetNum>0){if(opt==0)  insert(x),PetNum++;else {int pre=lower(x);int lat=upper(x);if(abs(pre-x)<=abs(x-lat))    dele(pre),ans=(ans+abs(pre-x))%mod;else    dele(lat),ans=(ans+abs(lat-x))%mod;PetNum--;}}else{if(opt==1)  insert(x),PetNum--;else{int pre=lower(x);int lat=upper(x);if((abs(pre-x))<abs(x-lat))    dele(pre),ans=(ans+abs(pre-x))%mod;//这里写小于等于和小于一样 else    dele(lat),ans=(ans+abs(lat-x))%mod;PetNum++;}}}printf("%d",ans);
}

 

 

 

 

转载于:https://www.cnblogs.com/zwfymqz/p/7895794.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 自定义指令可以实现哪些有用的功能

Vue 有一些很实用的指令 v-show v-if v-text v-html v-bind v-on 可以帮助我们实现很复杂的功能&#xff0c;同时它还开辟了钩子供我们自己实现自定义指令。根据自己平时开发总结了一些可以通过指令实现的功能场景&#xff1a;控制页面元素显示与隐藏&#xff0c;可用作控制权限…

正三角形的外接圆面积

描述给你正三角形的边长&#xff0c;pi3.1415926 ,求正三角形的外接圆面积。 输入只有一组测试数据 第一行输入一个整数n(1<n<1000)表示接下来要输入n个边长m(1.0<m<1000.0)输出输出每个正三角形的外接圆面积&#xff0c;保留两位小数&#xff0c;每个面积单独占一…

在线答卷系统的前端设计与数据库系统的设计与实现

如果要你实现一个在线的答题系统&#xff0c;你能想到它该具有哪些功能&#xff1f;当我接到这样一个需求的时候&#xff0c;脑海中立马能想到的就是它有录入题库的功能&#xff0c;创建试卷后可以从题库选择试题&#xff0c;并且可以针对试题进行分数的设置和排序。试卷发布后…

jgroups传输消息_使用JGroups进行ElasticMQ消息复制

jgroups传输消息ElasticMQ是一个消息服务器&#xff0c;具有Scala&#xff0c;Java和与Amazon SQS兼容的接口。 它通过跨服务器群集复制消息来支持有保证的消息传递&#xff0c;并通过日志记录实现消息持久性。 消息复制是ElasticMQ的核心功能之一。 但是&#xff0c;如果您看一…

使用 Element 组件搭建在线学习的课程卡片设计

假如我们要做一个在线课程学习的系统&#xff0c;其中我们需要做的一个功能就是课程信息流的一个展示&#xff0c;以等高卡片列表或者瀑布流的方式呈现。首先我们来罗列下这个卡片内应该包括哪些信息点&#xff1a;课程名称课程简介分类信息课程评分等级课程文件课时观看学习人…

MySQL多种安装方式选择

1.rpm包安装方式 rpm包的安装方式非常简单&#xff0c;这里以el6平台下的mysql-5.6.34版本为例&#xff0c;首先&#xff0c;要通过上述搜狐镜像地址下载到如下四个MySQL相关软件安装包。 a.下载安装包 MySQL-client-5.6.34-1.el6.x86_64.rpm MySQL-devel-5.6.34-1.el6.x86_64.…

12个很棒的Spring数据教程来启动您的数据项目

Spring Data的任务是为数据访问提供一个熟悉且一致的&#xff0c;基于Spring的编程模型&#xff0c;同时仍保留基础数据存储的特​​殊特征。 它使使用数据访问技术&#xff0c;关系和非关系数据库&#xff0c;map-reduce框架以及基于云的数据服务变得容易。 这是一个总括项目…

python多线程编程(3): 使用互斥锁同步线程

问题的提出 上一节的例子中&#xff0c;每个线程互相独立&#xff0c;相互之间没有任何关系。现在假设这样一个例子&#xff1a;有一个全局的计数num&#xff0c;每个线程获取这个全局的计数&#xff0c;根据num进行一些处理&#xff0c;然后将num加1。很容易写出这样的代码&am…

如何防止水印被恶意删除或者隐藏?

继上篇 Vue3 实现网页背景水印功能 我们了解了常见的网页水印功能是如何实现的&#xff0c;懂原理的都知道水印是通过在网页中添加代码绘制 DOM 元素覆盖在原有的网页上而来的&#xff0c;一旦你打开浏览器中的元素审查&#xff0c;可以通过删除元素或者在元素的样式上操作属性…

jmc线程转储_如何分析线程转储– IBM VM

jmc线程转储本文是我们的线程转储分析系列的第4部分&#xff0c;它将为您提供什么是IBM VM的JVM线程转储以及您将找到的不同线程和数据点的概述。 您将看到和学习​​到&#xff0c;IBM VM Thread Dump格式是不同的&#xff0c;但是提供了更多现成的故障排除数据。 在这一点上&…

java lock

多线程访问同一个变量&#xff0c;不进行同步&#xff0c;会造成结果不一致。这里解决方案有很多&#xff0c;使用原子变量。加锁同步&#xff0c;使用synchronized同步。下面是一个lock demo&#xff0c;后面会分析lock实现原理。lock使用的是公平锁还是非公平锁等 import jav…

Java 8:使用交替接口公开的类型安全地图生成器

动态展示您的课程 当我是Java新手时&#xff0c;我记得当时想过应该有一种方法可以删除或隐藏我不想公开的类中的方法。 就像用private方法或类似方法覆盖public方法一样&#xff08;哪种情况是不可能的&#xff0c;也不应该是不可能的&#xff09;。 显然&#xff0c;今天&…

nodejs面试题

1、为什么用Nodejs,它有哪些缺点&#xff1f; 事件驱动&#xff0c;通过闭包很容易实现客户端的生命活期。不用担心多线程&#xff0c;锁&#xff0c;并行计算的问题V8引擎速度非常快对于游戏来说&#xff0c;写一遍游戏逻辑代码&#xff0c;前端后端通用当然Nodejs也有一些缺点…

sts-bundle的使用_使用WS-Trust / STS采样器扩展JMeter

sts-bundle的使用JMeter没有对WS-Security或WS-Trust的任何内置支持&#xff0c;这使我为JMeter开发了此STS采样器–可以在负载测试STS时使任何人的生活变得更好。 首先&#xff0c;您需要拥有Apache JMeter发行版。 我正在使用v2.7。 然后&#xff0c;您可以从此处下载sts.sam…

001_jdk配置

配置JAVA_HOME,CLASSPATH,PATH 其中JAVA_HOME必须的 JAVA_HOMEE:\java\jdk1.8.0_77 CLASSPATH(告诉java程序运行时&#xff0c;你的类或者类库在哪里) .; E:\java\jdk1.8.0_77\lib\dt.jar;E:\java\jdk1.8.0_77\lib\tools.jar;E:\java\jdk1.8.0_77\jre\lib\rt.jar 改成变量 .;%J…

Spring MVC 4快速入门Maven原型得到了改进–更多Java 8功能

对于所有有兴趣在没有Spring Boot的情况下快速引导Spring 4应用程序的开发人员&#xff0c;请检查刚刚更新的我的Spring MVC 4 Quickstart Maven原型。 原型已经将Java 8用作目标平台已有一段时间了&#xff0c;但是不支持特定的Java 8功能。 最近的更改带来了Thymeleaf&#x…

python -- join()

python -- join()pythonjoinos月似当时&#xff0c;人似当时否&#xff1f;总 在 python 中&#xff0c;一共有两个 join 方法&#xff0c;一个是 str.join(),另一个是 os.path.join() &#xff0c;这里只了解前一种 str.join(iterable) 官方文档 Return a string which is the…

easymock教程_EasyMock教程–入门

easymock教程在本文中&#xff0c;我将向您展示EasyMock是什么&#xff0c;以及如何使用它来测试Java应用程序。 为此&#xff0c;我将创建一个简单的Portfolio应用程序&#xff0c;并使用JUnit&#xff06;EasyMock库对其进行测试。 在开始之前&#xff0c;让我们首先了解使用…

python 函数、面向对象

一、函数 1、定义个函数&#xff0c;可以对输入的数据进行排序&#xff0c; 通过参数来决定是正向排序还是反向排序。 number input(请输入一串数字&#xff1a;) number_list list(number) def sort_number(*args, s0): if s 0: number_map map(int,args)result sorted…

Spark数据倾斜解决方案(转)

本文转发自技术世界&#xff0c;原文链接 http://www.jasongj.com/spark/skew/ Spark性能优化之道——解决Spark数据倾斜&#xff08;Data Skew&#xff09;的N种姿势 发表于 2017-02-28 | 更新于 2017-10-17 | 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解…