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.
【题目分析】
输出中位数,其实可以维护两个堆,然后让这两个大根堆和小根堆保持平衡,大根堆中存小数,大根堆中放大数,然后保持平衡,就可以了。但是我用平衡树过了这道题目。
【代码】
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"); } }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- [数论]poj2635__The Embarrassed Cryptographer
- [二分图匹配]poj2446__Chessboard
- POJ1050 最大子矩阵和
- 用单调栈解决最大连续矩形面积问题