Shaolin

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)

Problem Description
Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temple every year, trying to be a monk there. The master of Shaolin evaluates a young man mainly by his talent on understanding the Buddism scripture, but fighting skill is also taken into account.
When a young man passes all the tests and is declared a new monk of Shaolin, there will be a fight , as a part of the welcome party. Every monk has an unique id and a unique fighting grade, which are all integers. The new monk must fight with a old monk whose fighting grade is closest to his fighting grade. If there are two old monks satisfying that condition, the new monk will take the one whose fighting grade is less than his.
The master is the first monk in Shaolin, his id is 1,and his fighting grade is 1,000,000,000.He just lost the fighting records. But he still remembers who joined Shaolin earlier, who joined later. Please recover the fighting records for him.
 
Input
There are several test cases.
In each test case:
The first line is a integer n (0 <n <=100,000),meaning the number of monks who joined Shaolin after the master did.(The master is not included).Then n lines follow. Each line has two integer k and g, meaning a monk's id and his fighting grade.( 0<= k ,g<=5,000,000)
The monks are listed by ascending order of jointing time.In other words, monks who joined Shaolin earlier come first.
The input ends with n = 0.
 
Output
A fight can be described as two ids of the monks who make that fight. For each test case, output all fights by the ascending order of happening time. Each fight in a line. For each fight, print the new monk's id first ,then the old monk's id.
 
Sample Input
3
2 1
3 3
4 2
0
 
Sample Output
2 1
3 2
4 2
 
Source
题意:找到最接近x的id;
思路:set二分可以写,练习treap;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
#define eps 1e-14
const int N=1e5+,M=1e6+,inf=;
const ll INF=1e18+,mod=;
struct Treap {
struct node {
node *son[];
int key,siz,wei,cnt,ID;
node(int _key,int _ID,node *f) {
son[]=son[]=f;
ID=_ID,key=_key;siz=cnt=;wei=rand();
}
void pushup() {
siz=son[]->siz+son[]->siz+cnt;
}
}*null,*root;
Treap() {
null=new node(,,);
null->siz=null->siz=;
null->wei=inf;root=null;// INF视情况而定
}
void rot(node* &rt,bool d) {
node* c=rt->son[!d];rt->son[!d]=c->son[d];
c->son[d]=rt;rt->pushup();c->pushup();rt=c;
}
void insert(const int &key,const int &ID,node* &rt) {
if (rt==null) {
rt=new node(key,ID,null);return ;
}
/*if (key==rt->key) {
rt->cnt++;rt->siz++;return ;
}*/
bool d=key>rt->key;
insert(key,ID,rt->son[d]);
if (rt->wei>rt->son[d]->wei) rot(rt,!d);
rt->pushup();
}
void remove(const int &key,node* &rt) {
if (rt==null) return ;
bool d=key>rt->key;
if (key==rt->key) {
if (rt->cnt>) {
rt->cnt--;rt->siz--;return ;
}
d=rt->son[]->wei>rt->son[]->wei;
if (rt->son[d]==null) {
delete rt;rt=null;return ;
}
rot(rt,!d);remove(key,rt->son[!d]);
} else remove(key,rt->son[d]);
rt->pushup();
}
node* select(int k,node* rt) {
int s=rt->son[]->siz+rt->cnt;
if (k>=rt->son[]->siz+&&k<=s) return rt;
if (s>k) return select(k,rt->son[]);
else return select(k-s,rt->son[]);
}
int rank(const int &key,node* rt) {
if (rt==null) return ;
int s=rt->son[]->siz+rt->cnt;
if (key==rt->key) return rt->son[]->siz+;
if (key<rt->key) return rank(key,rt->son[]);
else return s+rank(key,rt->son[]);
}
pair<int,int> pre(const int &k) {
node* t=root;int ret=;int ans=;
while (t!=null)
if (t->key<k) ret=t->key,ans=t->ID,t=t->son[];
else t=t->son[];
return make_pair(ret,ans);
}
pair<int,int> sub(const int &k) {
node* t=root;int ret=;int ans=;
while (t!=null)
if (t->key>k) ans=t->ID,ret=t->key,t=t->son[];
else t=t->son[];
return make_pair(ret,ans);
}
};
#define par pair<int,int>
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==)break;
Treap tree;
tree.insert(,,tree.root);
tree.insert(-(1e9),-,tree.root);
while(n--)
{
int id,x;
scanf("%d%d",&id,&x);
printf("%d ",id);
par p=tree.pre(x);
par q=tree.sub(x);
if(abs(p.first-x)<=abs(q.first-x))
printf("%d\n",p.second);
else
printf("%d\n",q.second);
tree.insert(x,id,tree.root);
}
}
return ;
}

hdu 4585 Shaolin treap的更多相关文章

  1. HDU 4585 Shaolin(Treap找前驱和后继)

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Su ...

  2. HDU 4585 Shaolin(STL map)

    Shaolin Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit cid= ...

  3. [HDU 4585] Shaolin (map应用)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4585 题目大意:不停的插入数字,问你跟他相距近的ID号.如果有两个距离相近的话选择小的那个. 用map ...

  4. A -- HDU 4585 Shaolin

    Shaolin Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %I64d , %I64u Java clas ...

  5. hdu 4585 Shaolin(STL map)

    Problem Description Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shao ...

  6. HDU 4585 平衡树Treap

    点击打开链接 题意:给出n组数,第一个数是id.第二个数是级别.每输入一个.输出这个人和哪个人打架,这个人会找和他级别最相近的人打,假设有两个人级别和他相差的一样多,他就会选择级别比他小的打架. 思路 ...

  7. HDU 4585 Shaolin (STL)

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  8. HDU 4585 Shaolin(水题,STL)

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  9. HDU 4585 Shaolin (STL map)

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

随机推荐

  1. MultiWiiWinGUI 汉化版

    已经基本汉化完毕 下载

  2. Java绘图

    paintComponent(Graphics g)方法: 1.不调用super.paintComponent(g)的话,rePaint()的时候就会把你写的paintComponent中的内容绘制上 ...

  3. Linux 挂载U盘

    命令模式下挂载,图形的一般可以自动识别. #fdisk -l      --查看linux 硬盘分区 这个/dev/sdg1 就是我的U盘了,这里挂载的fat格式的 # mount /dev/sdg1 ...

  4. FTF登入tiny210开发板

    配置环境一: 第一步:安装虚拟机             1)安装虚拟机+Linux12.04             2)安装FTP软件 第二步:配置超级终端(串口)             1)开 ...

  5. SSH整合报错:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped[......]

    非常诡异的报错,信息如下:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [select count(* ...

  6. PeopleSoft Home Subdirectories

    PeopleSoft Home Subdirectories appserv — home to the Application Server and Process Scheduler Server ...

  7. 夺命雷公狗-----React---19--表单的值的修改

    少了1个e,在代码部分补回,否则会报错 <!DOCTYPE> <html> <head> <meta charset="utf-8"> ...

  8. python与ruby的差别

    1.引用文件差别 Ruby:同一目录下的文件,如/usr/local/ruby/foo.rb与/usr/local/ruby/bar.rb两个文件.如果直接在foo.rb中 require 'bar' ...

  9. android使用ksoap2调用sap的webservice

    public void on_clicked(View view) { Thread webserviceThread = new Thread() { public void run() { Str ...

  10. Scala学习笔记之二--基本数据类型

    前言 本篇主要讲Scala的基本数据类型,更多教程请参考:Scala教程 基本数据类型 Scala一共提供了9中数据类型,Scala的基本数据类型与java中的基本数据类型是一一对应的,这是Scala ...