| ||||||||||
| 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 | |||||||||
小菜鸟急需高手帮助优化堆结构!!!#include<iostream>
#include<cstdio>
#define N 30001
using namespace std;
int a[N],b[N],c[N],d[N],count=0,big=1,small=0;
void Small(int s,int n)
{
int j,rc;
rc=c[s];
for(j=2*s;j<=n;j*=2)
{
if(j<n&&c[j]>c[j+1]) ++j;
if(!(rc>c[j]))
break;
c[s]=c[j];
s=j;
}
c[s]=rc;
}
void Big(int s,int n)
{
int j,rc;
rc=a[s];
for(j=2*s;j<=n;j*=2)
{
if(j<n&&a[j]<a[j+1]) ++j;
if(!(rc<a[j]))
break;
a[s]=a[j];
s=j;
}
a[s]=rc;
}
void AddSmall(int e)
{
int i;
c[++small]=e;
for(i=small/2;0<i;i--)
Small(i,small);
}
void AdjustSmall()
{
int i;
if(small>1)
{
for(i=1;i<small;i++)
c[i]=c[i+1];
small--;
for(i=small/2;i>0;i--)
Small(i,small);
}
else
small=0;
}
void AddBig(int e)
{
int i;
a[++big]=e;
for(i=big/2;i>0;i--)
Big(i,big);
}
void AdjustBig(int e)
{
int i;
a[1]=e;
for(i=big/2;i>0;i--)
Big(i,big);
}
int main()
{
bool start=false;
int m,n,i,j;
scanf("%d %d",&m,&n);
for(i=1;i<=m;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
if(b[1]>1)
for(j=2;j<=b[1];j++)
if(a[1]<=a[j])
AddSmall(a[j]);
else
{
AddSmall(a[1]);
AdjustBig(a[j]);
}
d[count++]=a[1];
if(small>=1)
{
AddBig(c[1]);
AdjustSmall();
start=true;
}
else
AddBig(a[big+1]);
for(i=2;i<=n;i++)
{
j=b[i-1]+1;
if(!start)
j++;
for(;j<=b[i]&&b[i]!=b[i-1];j++)
if(a[1]<=a[j])
AddSmall(a[j]);
else
{
AddSmall(a[1]);
AdjustBig(a[j]);
}
d[count++]=a[1];
start=false;
if(small>=1)
{
AddBig(c[1]);
AdjustSmall();
start=true;
}
else
AddBig(a[big+1]);
}
for(i=0;i<n;i++)
printf("%d\n",d[i]);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator