| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
自创算法:对顶堆算法在线求中位数 0MS对顶堆,又叫中根堆、上下堆,是一种可以LOGN维护在线求中位数的算法
思想是维护两个堆,一个小根堆,一个大根堆,保证大根堆中的任意元素小于小根堆,并维护两堆元素数平衡
其中一堆堆顶即为中位数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void swap(int &x,int &y){int z=x;x=y;y=z;}
int topheap[5010],toptop,bottomheap[5010],bottomtop;//两个堆,其中上堆是小根堆,下堆是大根堆
void topinsert(int x)//上堆插入
{
topheap[++toptop]=x;
int t=toptop;
while(t>1&&topheap[t]<topheap[t>>1])
swap(topheap[t],topheap[t>>1]),t>>=1;
}
void bottominsert(int x)//下堆插入
{
bottomheap[++bottomtop]=x;
int t=bottomtop;
while(t>1&&bottomheap[t]>bottomheap[t>>1])
swap(bottomheap[t],bottomheap[t>>1]),t>>=1;
}
void toppop()//上堆弹顶
{
int t=2;
topheap[1]=topheap[toptop];topheap[toptop--]=0;
while(t<=toptop)
{
if(topheap[t]>topheap[t+1]&&t<toptop)t++;
if(topheap[t]<topheap[t>>1])swap(topheap[t],topheap[t>>1]),t<<=1;
else break;
}
}
void bottompop()//下堆弹顶
{
int t=2;
bottomheap[1]=bottomheap[bottomtop];bottomheap[bottomtop--]=0;
while(t<=bottomtop)
{
if(bottomheap[t]<bottomheap[t+1]&&t<bottomtop)t++;
if(bottomheap[t]>bottomheap[t>>1])swap(bottomheap[t],bottomheap[t>>1]),t<<=1;
else break;
}
}
void add(int x)//插入
{
if(x<=bottomheap[1])bottominsert(x);
else topinsert(x);
//插入,保证下堆的任意元素都小于等于上堆的任意元素
//注意一定要和下堆堆顶比较,因为第一次插入后元素一定在下堆,如果和上堆堆顶比较就会WA
while(toptop>bottomtop)bottominsert(topheap[1]),toppop();
while(bottomtop>toptop+1)topinsert(bottomheap[1]),bottompop();
//维护上下堆平衡,保证两堆元素数相等或下堆元素数比上堆元素数多1
}
int ans[1010][5010];
int main()
{
int p,i,j,k,x,m;
scanf("%d",&p);
for(j=1;j<=p;j++)
{
scanf("%d%d",&i,&m);
memset(topheap,0,sizeof topheap);
memset(bottomheap,0,sizeof topheap);
toptop=bottomtop=0;
for(k=1;k<=m;k++)
{
scanf("%d",&x);add(x);
if(k&1)ans[i][++ans[i][0]]=bottomheap[1];
}
}
for(i=1;i<=p;i++)
{
printf("%d %d\n",i,ans[i][0]);
for(j=1;j<=ans[i][0];j++)
{
printf("%d",ans[i][j]);
if(j!=ans[i][0])printf(" ");
if(j%10==0)printf("\n");
}
printf("\n");
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator