您的位置:首页 > 其它

POJ 3784 Running Median

2016-07-06 18:46 260 查看
Description

For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far.

【题目分析】

输出中位数,其实可以维护两个堆,然后让这两个大根堆和小根堆保持平衡,大根堆中存小数,大根堆中放大数,然后保持平衡,就可以了。但是我用平衡树过了这道题目。

【代码】

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct node{
int l,r,v,w,size,rand;//v值 w次数
}t[100100];
int root,cnt=0,ans;
inline void up(int k)
{t[k].size=t[t[k].l].size+t[t[k].r].size+t[k].w;}
inline void rturn(int &k)
{
int now=t[k].l;
t[k].l=t[now].r;
t[now].r=k;
t[now].size=t[k].size;
up(k);
k=now;
}
inline void lturn(int &k)
{
int now=t[k].r;
t[k].r=t[now].l;
t[now].l=k;
t[now].size=t[k].size;
up(k);
k=now;
}
inline void insert(int &k,int x)
{
if (k==0) {t[++cnt].v=x;t[cnt].w=1;t[cnt].size=1;t[cnt].rand=rand();k=cnt;return ;}
t[k].size++;
if (x==t[k].v) t[k].w++;
else if (x>t[k].v){insert(t[k].r,x);if (t[t[k].r].rand<t[k].rand);lturn(k);}
else {insert(t[k].l,x);if (t[t[k].l].rand<t[k].rand);rturn(k);}
}
inline int qn(int &k,int x)//询问数字
{
if (k==0) return 0;
if (x<=t[t[k].l].size) return qn(t[k].l,x);
if (x>t[t[k].l].size+t[k].w) return qn(t[k].r,x-t[t[k].l].size-t[k].w);
else return t[k].v;
}
int main()
{
int n;
scanf("%d",&n);
while (n--)
{
root=0;cnt=0;memset(t,0,sizeof t);
int a,b;
scanf("%d%d",&a,&b);
printf("%d %d\n",a,(b+1)/2);
for (int i=1;i<=b;++i)
{
int x;
scanf("%d",&x);
insert(root,x);
if (i&1) printf("%d ",qn(root,(i+1)/2));
if (i%20==0) printf("\n");
}
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj