Shaolin

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 3191    Accepted Submission(s): 1350

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
 

题目链接:HDU 4585

题意就是少林寺里有一个初始的人,他的id是1,武力值是1e9,然后按照输入顺序有n个人来少林寺挑战,输出n行,对应每一个来挑战的人给他分配的对手是谁。如何分配对手的规则题目已经讲了。

简单的做法就是建一颗Treap,然后在树上进行二分答案,找前驱与后继再比较判断得出答案即可,水题一道

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 100010;
struct Treap
{
int ls, rs, v, sz, id;
int rnd;
};
Treap T[N];
int rt, tot; void init()
{
rt = 0;
tot = 0;
}
void pushup(int k)
{
T[k].sz = T[T[k].ls].sz + T[T[k].rs].sz + 1;
}
void lturn(int &k)
{
int rs = T[k].rs;
T[k].rs = T[rs].ls;
T[rs].ls = k;
T[rs].sz = T[k].sz;
pushup(k);
k = rs;
}
void rturn(int &k)
{
int ls = T[k].ls;
T[k].ls = T[ls].rs;
T[ls].rs = k;
T[ls].sz = T[k].sz;
pushup(k);
k = ls;
}
void ins(int &k, int v, int id)
{
if (!k)
{
k = ++tot;
T[k].ls = T[k].rs = 0;
T[k].v = v, T[k].id = id;
T[k].sz = 1;
T[k].rnd = rand();
}
else
{
++T[k].sz;
if (v < T[k].v)
{
ins(T[k].ls, v, id);
if (T[T[k].ls].rnd < T[k].rnd)
rturn(k);
}
else
{
ins(T[k].rs, v, id);
if (T[T[k].rs].rnd < T[k].rnd)
lturn(k);
}
}
}
void get_pre(int k, int v, int &ans)
{
if (!k)
return ;
if (T[k].v < v)
{
ans = k;
get_pre(T[k].rs, v, ans);
}
else
get_pre(T[k].ls, v, ans);
}
void get_post(int k, int v, int &ans)
{
if (!k)
return ;
if (T[k].v > v)
{
ans = k;
get_post(T[k].ls, v, ans);
}
else
get_post(T[k].rs, v, ans);
}
int main(void)
{
srand(987654321);
int n;
while (~scanf("%d", &n) && n)
{
init();
ins(rt, 1e9, 1);
while (n--)
{
int id, v;
scanf("%d%d", &id, &v);
int pre = -1, post = -1;
get_pre(rt, v, pre);
get_post(rt, v, post);
if (pre == -1)
printf("%d %d\n", id, T[post].id);
else if (post == -1)
printf("%d %d\n", id, T[pre].id);
else
{
int dxpre = abs(v - T[pre].v), dxpost = abs(v - T[post].v);
if (dxpre < dxpost)
printf("%d %d\n", id, T[pre].id);
else if (dxpre > dxpost)
printf("%d %d\n", id, T[post].id);
else
printf("%d %d\n", id, T[pre].id);
}
ins(rt, v, id);
}
}
return 0;
}

HDU 4585 Shaolin(Treap找前驱和后继)的更多相关文章

  1. hdu 4585 Shaolin treap

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

  2. HDU 4585 Shaolin(STL map)

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

  3. HDU 4585 Shaolin (STL map)

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

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

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

  5. HDU 4585 平衡树Treap

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

  6. A -- HDU 4585 Shaolin

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

  7. hdu 4585 Shaolin(STL map)

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

  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还有排序功能,默认按照键值从小到大排序 #include <cstdio> #include <iostream> #include <cstring> ...

随机推荐

  1. 如何在RedHat 7.0系统中安装mysql 5.7.22

    如何在RedHat 7.0系统中安装mysql 5.7.22 今天给大家介绍一下如何安装mysql5.7,在安装之前,首先要查看的是,你的系统中有没有已经安装过的情况.键入rpm -qa|grep m ...

  2. mysql,oracle表数据相互导入

    mysql导入oracle: 例如mysql中有ts_user_info表,现在要导入到oracle中的user_info表 1:导出mysql表数据到data.txt文件 mysql> sel ...

  3. c#字符显示转换{0:d} string.Format()

    这一篇实际和前几个月写的没什么本质上的区别.但是这篇更明确一点,学起来easy c#字符显示转换{0:d} C#:String.Format数字格式化输出 : int a = 12345678; // ...

  4. h5页面苹果端浮动问题

    最近在开发一个h5的app端,前端同事写好页面,我们后端java动态化页面,测试的时候发现安卓端什么浏览器都正常如下图1,可是苹果端无论什么浏览器都出现了底部菜单缺少了两个下图2图一:正常显示 图2, ...

  5. javascript 运行机制 事件循环 浏览器缓存 (慕课网 前段跳槽面试必备 4-1,4-2,4-3)

    4-1 渲染机制:-1-,什么是DOCTYPE及其作用?DTD(document type definition,文档类型定义)是一系列的语法规则,用来定义XML或(X)HTML的文件类型,浏览器会使 ...

  6. C语言结构体指针成员强制类型转换

    #include <stdio.h> #include <stdlib.h> typedef struct ListElmt_ { void *data; struct Lis ...

  7. MySQL查询优化 对not in 、in 的优化

    因为 not in不走索引,所以不在不得已情况下,就不要使用not in 下面使用 join 来替代not in 做查询 select ID from A where ID not in (selec ...

  8. attention发展历史及其相应论文

    这个论文讲述了attention机制的发展历史以及在发展过程的变体-注意力机制(Attention Mechanism)在自然语言处理中的应用 上面那个论文提到attention在CNN中应用,有一个 ...

  9. 使用python写一个最基本的mapreduce程序

    一个mapreduce程序大致分成三个部分,第一部分是mapper文件,第二个就是reducer文件,第三部分就是使用hadoop command 执行程序. 在这个过程中,困惑我最久的一个问题就是在 ...

  10. Python学习之高级特性

    切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取.这种方法可以帮助我们依次获取我们想要 ...