题目大意

给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数。即前1,3,5,……个数的中位数。

题解

要找到中位数我们需要的序列是单调不减的,故可以用二叉平衡树解决。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int MAX_NODE = 100010;struct SplayTree
{
private:struct Node{Node *LeftSon, *RightSon, *Father;int Key, Size, Count;Node(Node *fa, int key) : Father(fa), LeftSon(NULL), RightSon(NULL), Key(key), Size(1), Count(1){}bool IsLeftSon(){return Father->LeftSon == this;}void Refresh(){Size = (LeftSon ? LeftSon->Size : 0) + (RightSon ? RightSon->Size : 0) + Count;}bool IsRoot(){return Father == NULL || (Father->LeftSon != this && Father->RightSon != this);}}*Root;void Rotate(Node *cur){Node *gfa = cur->Father->Father;Node **gfaSon = gfa ? (cur->Father->IsLeftSon() ? &gfa->LeftSon : &gfa->RightSon) : &Root;Node **faSon = cur->IsLeftSon() ? &cur->Father->LeftSon : &cur->Father->RightSon;Node **curSon = cur->IsLeftSon() ? &cur->RightSon : &cur->LeftSon;*faSon = *curSon;if (*faSon)(*faSon)->Father = cur->Father;*curSon = cur->Father;(*curSon)->Father = cur;*gfaSon = cur;(*gfaSon)->Father = gfa;(*curSon)->Refresh();cur->Refresh();}void PushDown() {}void Splay(Node *cur){PushDown();while (cur->Father){if (!cur->Father->IsRoot())Rotate(cur->Father->IsLeftSon() == cur->IsLeftSon() ? cur->Father : cur);Rotate(cur);}}int GetKeyByRank(Node *cur, int rank){int rootSize, leftSize = (cur->LeftSon ? cur->LeftSon->Size : 0);if (rank <= leftSize)return GetKeyByRank(cur->LeftSon, rank);else if (rank <= (rootSize = leftSize + cur->Count))return cur->Key;elsereturn GetKeyByRank(cur->RightSon, rank - rootSize);}public:void Insert(int key){Node **cur = &Root, *fa = NULL;while (*cur){fa = *cur;if (key == (*cur)->Key){(*cur)->Count++;Splay(*cur);return;}else if (key < (*cur)->Key)cur = &(*cur)->LeftSon;else if (key > (*cur)->Key)cur = &(*cur)->RightSon;}*cur = new Node(fa, key);Splay(*cur);}int GetKeyByRank(int rank){return GetKeyByRank(Root, rank);}
}g;int main()
{static int A[MAX_NODE];int n;scanf("%d", &n);for (int i = 1; i <= n; i++)scanf("%d", A + i);for (int i = 1; i <= n; i += 2){g.Insert(A[i]);printf("%d\n", g.GetKeyByRank(i / 2 + 1));g.Insert(A[i + 1]);}return 0;
}

转载于:https://www.cnblogs.com/headboy2002/p/9028748.html

luogu1168 中位数相关推荐

  1. 剑指offer:面试题41. 数据流中的中位数

    题目:数据流中的中位数 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数 ...

  2. leetcode-295 数据流的中位数

    中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操 ...

  3. C++的 STL堆 实现获取中位数

    前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 中位数: ...

  4. python dataframe 中位数_python下的Pandas中DataFrame基本操作(一),基本函数整理

    pandas作者Wes McKinney 在[PYTHON FOR DATA ANALYSIS]中对pandas的方方面面都有了一个权威简明的入门级的介绍,但在实际使用过程中,我发现书中的内容还只是冰 ...

  5. LeetCode实战:寻找两个有序数组的中位数

    题目英文 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...

  6. 一道简约而不简单的算法题——数据流的中位数 | 附动画解析

    作者 | 程序员小吴 转载自微信公众号(ID:CXYxiaowu) 题目来源于 LeetCode 上第 295 号问题:数据流的中位数.难度级别为 Hard,目前通过率为 33.5% . 题目描述 中 ...

  7. 2017年首份中美数据科学对比报告,Python受欢迎度排名第一,美国数据工作者年薪中位数高达11万美金

    最新消息,Kaggle最近对机器学习及数据科学领域进行了全行业深度调查,调查共收到超过 16,000 份回复,受访内容包括最受欢迎的编程语言是什么,不同国家数据科学家的平均年龄是什么,不同国家的平均年 ...

  8. 用bitmap实现中位数的算法

    常见面试题之一:50亿个整数,内存限制为1G,找出中位数. 50亿个整数用bitmap来存储的话,大约150M的空间就足够了. 下面是具体的算法,用PHP实现. define("MASK&q ...

  9. python求无序列表中位数_python 实现在无序数组中找到中位数方法

    一.问题描述 1.求一个无序数组的中位数, (若数组是偶数,则中位数是指中间两个数字之和除以2,若数组是奇数,则中位数是指最中间位置.要求:不能使用排序,时间复杂度尽量低 2.例如:lists = [ ...

最新文章

  1. js事件详解二:鼠标和滚轮事件
  2. wpgcms---流程控制
  3. Virtual方法和Abstract方法的使用区别
  4. 通过History Trends Unlimited通过统计笔记本Chrome浏览器Top10网页历史访问量(截止至2021.11.23)
  5. AlphaGo、人工智能、深度学习解读以及应用
  6. oracle创建表时创建序列号,oracle表中怎么建序列
  7. 计算机视觉、机器学习、人工智能领域知识汇总
  8. 工程化,模块化,组件化,规范化
  9. MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)
  10. window7安装虚拟机上网
  11. Windows11 + Linux子系统(ubuntu)体验(篇一)
  12. 舍伍德算法解决线性时间选择
  13. 高并发高可用高可靠性的千人千面项目技术架构分析
  14. html5的calc,CSS 计算属性 calc()的完整指南(下)
  15. 崩坏3卡池模拟器及毕业期望概率计算(含保底)
  16. gitee仓库创建和git一些常见命令
  17. can 分析仪 can卡 ——深圳超力源7220 电摩保护板联调时一个CAN盒解决所有的问题
  18. 牛客OI周赛7-提高组(A 小睿睿的等式)
  19. 华为模拟器eNSP基础配置命令
  20. Delphi2010强化的反射

热门文章

  1. 智慧交通day04-特定目标车辆追踪01:总览概述
  2. 【Pytorch神经网络实战案例】04 使用Pytorch实现线性回归
  3. LeetCode 664. 奇怪的打印机(区间DP)
  4. LeetCode 1690. 石子游戏 VII(博弈DP)
  5. LeetCode 1181. 前后拼接(哈希map)
  6. LeetCode MySQL 1435. 制作会话柱状图
  7. LeetCode 第 16 场双周赛(402/822,前48.9%)
  8. LeetCode 547. 朋友圈(图的遍历BFS DFS)
  9. NumPy快速入门-- Less 基础/线性代数
  10. 计算机用户登录,计算机术语:密码、用户、登录