Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:老是WA,有没有高手知道原因?极度郁闷中。。。。。

Posted by brightstar5 at 2010-04-05 19:50:53 on Problem 2823
In Reply To:老是WA,有没有高手知道原因?极度郁闷中。。。。。 Posted by:brightstar5 at 2010-04-05 16:00:32
已解决

#include<algorithm>
using namespace std;
int a[1000011];//数组数据
struct Heap
{
	int x;//堆元素值
	int ID;//堆元素在数组a[]中的下标
};
Heap D[1000011];//最大堆
Heap X[1000011];//最小堆

int DL[1000011];//DL[i]表示数组a[i]在D中的下标
int XL[1000011];//XL[i]表示数组a[i]在X中的下标

int OutMin[1000011];//最小值
int OutMax[1000011];//最大值

int n,k;
void HeapAdjust(Heap H[] ,int s,int m,int L[],bool isMax)
{
	Heap rc=H[s];
	int j;
	for(j=s*2;j<=m;j*=2)
	{
		if(isMax)
		{		
			if(j<m && H[j].x < H[j+1].x)
				j++;
			if(rc.x > H[j].x)break;
			H[s]=H[j];
			L[ H[j].ID ]=s;
			s=j;
		}
		else
		{
			if(j<m && H[j].x > H[j+1].x)
				j++;
			if(rc.x < H[j].x)break;
			H[s]=H[j];
			L[ H[j].ID ]=s;
			s=j;
		}
	}
	H[s]=rc;
	L[rc.ID]=s;

}
void MakeHeap(Heap H[],int length,int L[],bool isMax)
{
	for(int i=length/2;i>0;--i)
	{
		HeapAdjust(H,i,length,L,isMax);
	}
}
int main()
{
	int i;
	int s;
	scanf("%d%d",&n,&k);
	if(k>n)
		k=n;
	for(i=1;i<=k;++i)
	{
		scanf("%d",&a[i]);

		D[i].x=a[i];
		D[i].ID=i;
		DL[i]=i;

		X[i].x=a[i];
		X[i].ID=i;
		XL[i]=i;
	}
	for(i=k+1;i<=n;++i)
	{
		scanf("%d",&a[i]);
	}
	MakeHeap(D,k,DL,true);
	MakeHeap(X,k,XL,false);
	OutMax[0]=D[1].x;
	OutMin[0]=X[1].x;
	s=k/2;
	for(i=k+1;i<=n;++i)
	{		
		int j;
		int d=DL[i-k];
		D[d].x=a[i];
		D[d].ID=i;
		DL[i]=d;
		j=d > s ? d/2 : d;
		for(;j>0;j/=2)
		{
			HeapAdjust(D,j,k,DL,true);
		}

		int dd=XL[i-k];
		X[dd].x=a[i];
		X[dd].ID=i;
		XL[i]=dd;
		j=dd >s ? dd/2 : dd;
		for(;j>0;j/=2)
		{
			HeapAdjust(X,j,k,XL,false);
		}
		
		OutMax[i-k]=D[1].x;
		OutMin[i-k]=X[1].x;

	}
	for(i=0;i<=(n-k);++i)
	{
		printf("%d%c", OutMin[i], (i < n - k) ? ' ' : '\n'); 

	}
	for(i=0;i<=(n-k);++i)
	{
		printf("%d%c", OutMax[i], (i < n - k) ? ' ' : '\n'); 
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator