题目链接

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

题目大意:有一群和尚,他们各自有一个编号和技能值,每一个新和尚加入时都要和和他技能值最接近的和尚打斗一下,如果有两个技能值接近程度一样,那么优先选择技能值小于他的。输出两个和尚的编号,新和尚在前,老和尚在后。最早有一个编号为1,技能值为10亿的和尚。

分析:标准的求前驱(X的前驱是小于X且最大的数)和后继(X的后继是大于X且最小的数),求出前驱和后继后再按照题意比较。

代码如下;

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;const int N=100005;struct monk
{int id;int grade;
}in[N];int root,s,ans;struct node
{int l;int r;int val;int monkid;int ran;
}tree[N];void lturn(int &k)
{int t=tree[k].r;tree[k].r=tree[t].l;tree[t].l=k;k=t;
}void rturn(int &k)
{int t=tree[k].l;tree[k].l=tree[t].r;tree[t].r=k;k=t;
}void ins(int &k,int x,int id)
{if(k==0){s++;k=s;tree[k].val=x;tree[k].monkid=id;tree[k].ran=rand();return;}else if(tree[k].val<x){ins(tree[k].r,x,id);if(tree[k].ran>tree[tree[k].r].ran)lturn(k);}else{ins(tree[k].l,x,id);if(tree[k].ran>tree[tree[k].l].ran)rturn(k);}
}
void querypro(int k,int x)
{if(k==0)return ;if(tree[k].val<x){ans=k;querypro(tree[k].r,x);}elsequerypro(tree[k].l,x);
}void querysub(int k,int x)
{if(k==0)return;if(tree[k].val>x){ans=k;querysub(tree[k].l,x);}elsequerysub(tree[k].r,x);
}
int main()
{int n;while(scanf("%d",&n)!=EOF){if(n==0)break;memset(tree,0,sizeof(tree));root=0;s=0;for(int i=1;i<=n;i++){scanf("%d %d",&in[i].id,&in[i].grade);}ins(root,1000000000,1);for(int i=1;i<=n;i++){ins(root,in[i].grade,in[i].id);ans=0;querypro(root,in[i].grade);int tmp1=tree[ans].val;int tmp2=tree[ans].monkid;//printf("pro=%d %d\n",tmp1,tmp2);ans=0;querysub(root,in[i].grade);int tmp3=tree[ans].val;int tmp4=tree[ans].monkid;//printf("sub=%d %d\n",tmp3,tmp4);if(tmp2==0)printf("%d %d\n",in[i].id,tmp4);else if(tmp4==0)printf("%d %d\n",in[i].id,tmp2);else if(tmp3-in[i].grade<in[i].grade-tmp1)printf("%d %d\n",in[i].id,tmp4);else if(in[i].grade-tmp1<=tmp3-in[i].grade)printf("%d %d\n",in[i].id,tmp2);}}return 0;
}

HDU4585 Shaolin(treap)相关推荐

  1. 【Treap】bzoj1588-HNOI2002营业额统计

    一.题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司 ...

  2. 【bzoj2770】YY的Treap 权值线段树

    题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...

  3. 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...

  4. luogu P2596 [ZJOI2006]书架(平衡树、无旋treap(按排名分裂)一些更复杂的操作)

    P2596 [ZJOI2006]书架 无旋treap可以维护一棵树的中序遍历结果.但是不支持通过编号来找节点.于是在无旋treap的基础上,我维护了每个节点的父亲,这样就可以求出一个节点是中序遍历中的 ...

  5. luogu P3391 【模板】文艺平衡树(FHQ - treap,懒惰标记)

    整理的算法模板合集: ACM模板 我们把每个查询区间使用solit分裂成[1l−1][lr][r+1n][1~l-1][l~r][r+1~n][1 l−1][l r][r+1 n]三个区间. 再把[l ...

  6. 模板 - FHQ - treap 无旋平衡树

    整理的算法模板合集: ACM模板 目录 FQH - treap 无旋平衡树 按权值分裂 按排名分裂 文艺平衡树 可持久化序列 FQH - treap 无旋平衡树 operator 1 : 插入一个数 ...

  7. 【数据结构】平衡树 - treap

    treap = tree + heap 树堆(treap:让BST尽量随机) 动态维护一个有序序列 对于一个大根堆: 最大值:一直往右走 最小值:一直往左走 treap实现操作 set实现 ①插入 i ...

  8. BZOJ1112[POI2008]砖块Klo——非旋转treap

    题目描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任 ...

  9. 三大平衡树(Treap + Splay + SBT)总结+模板

    Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...

  10. codeforces 293E Close Vertices 点分治+滑窗+treap

    http://codeforces.com/contest/293/problem/E 题意:求树上合法点对的个数.合法条件为:路径长度<=W,路径边数<=L. 显然是点分治.求解的时候第 ...

最新文章

  1. linux内核微妙时,Linux内核模块时间同步函数汇总
  2. ios FMDB数据库添删改查应用
  3. PHP 全局变量global详解
  4. (转载)用oracle触发器对记录表增加记录的问题
  5. .NET 5 Preview 1的深度解读和跟进
  6. 在你的andorid设备上运行netcore (Linux Deploy)
  7. html5爱情树怎么修改,jQuery结合HTML5制作的爱心树表白动画
  8. python读取与写入文件
  9. Applets 是什么 怎样使用 应用前景
  10. 用几行代码写的bat小病毒
  11. 计算机内存条如何区分频率,什么是内存条的频率? 怎么看内存条频率?
  12. 回答阿里云实名认证常见问题
  13. 介入治疗在胰腺癌的作用
  14. 树莓派(七):调取IP摄像头
  15. 2021最新 RocketMQ面试题精选(附刷题小程序)
  16. docker 使用tar安装mysql_Docker安装MySQL
  17. 未来的计算机更加聪明,雷蒙德·库兹韦尔认为,在未来计算机不仅能变得聪明,而且会比人类还要聪明。...
  18. oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...
  19. 进销存:利用SRM满足客户体验与需求
  20. js下载文件、音频、视频的方式

热门文章

  1. java打造手机远程控制电脑之详细教程
  2. python编程 从入门到实践 第五章 if语句
  3. android睡眠伴侣,GitHub - HuangZengPei/Sleepmon: 我的Android团队项目,一款可以监测、统计睡眠质量情况的睡眠健康伴侣应用。...
  4. OSChina 周日乱弹 —— 前女友给你邮寄了一本书
  5. 【愚公系列】2022年10月 基于WPF的智能制造MES系统框架-简介
  6. matplotlib4 --设置line的属性, color,linestyle, linewidth, marker等
  7. 一个按钮控制定时器的开始与暂停
  8. 索尼koov机器人比赛_搭上“想象”去成长 索尼KOOV可编程教育机器人评测
  9. 万网域名查询是否注册接口
  10. 计算机的文件怎么加密码怎么设置,文件夹怎么设置密码,教您怎么设置