题目大意

给出一个长度为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;
else
return 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;
}

最新文章

  1. premierepro破解
  2. 【读书笔记】iOS网络-保护网络传输
  3. SpringMVC java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name
  4. iOS8 推送注册方式改变的问题
  5. 日志基本概念/rSyslog
  6. Realtek 8168 安装 VMware ESXi 提示没有驱动
  7. CF Set of Strings
  8. AJAX入门---DOM操作HTML
  9. CSS自适应的占位符效果
  10. C和C++混合编程之 extern “C”的使用
  11. Longest Ordered Subsequence POJ - 2533 最长上升子序列dp
  12. jvm实战-jvm调优
  13. 移植Valgrind检测Android JNI内存泄漏
  14. redux 知识点
  15. 利用gulp搭建less编译环境
  16. ssh tunnel
  17. Idea破解办法+idea免费生成注册码+jsp属性选择器+注解什么的都报错
  18. 池建强 博客 Mac使用技巧 第一季
  19. Django_WSGIRequest对象
  20. 如何把本地git仓库托管到码云上

热门文章

  1. 数据连接类 这里采用mysql
  2. DE2之7-segment displays
  3. chown chmod chgrp chattr chroot usermod 命令简单分析
  4. (转)基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理
  5. H3C交换机配置学习随笔
  6. 物理cpu与逻辑cpu概述
  7. eas更改用户组织范围和业务组织范围
  8. [转载]ext4文件系统的delalloc选项造成单次写延迟增加的分析
  9. GDI 画刷(10)
  10. js-2018-11-09 关于Array中的srot()方法和compare()方法