记录编号 21697 评测结果 AAAAAAAAA
题目名称 [POJ 2823]滑动窗口 最终得分 100
用户昵称 GravatarPom 是否通过 通过
代码语言 C++ 运行时间 2.543 s
提交时间 2010-11-12 19:29:39 内存使用 53.68 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

using namespace std;

const int MAXN=1000222;

int n,m,i,j,k,ps=0,ans1[MAXN],ans2[MAXN],x,y;

struct xds
{
	int da,xiao,l,r;
	xds *cl,*cr;
}T[MAXN*2],*root=T;

void mkt(int l,int r,xds *p)
{
	p->l=l;
	p->r=r;
	int mid=(l+r)>>1;
	if (r>l)
	{
		++ps;
		p->cl=T+ps;
		mkt(l,mid,p->cl);
		++ps;
		p->cr=T+ps;
		mkt(mid+1,r,p->cr);
		p->xiao=min(p->cl->xiao,p->cr->xiao);
		p->da=max(p->cl->da,p->cr->da);
	}
	else 
	{
		scanf("%d",&mid);
		p->da=p->xiao=mid;
	}
}

void init()
{
	freopen("window.in","r",stdin);
	freopen("window.out","w",stdout);
	scanf("%d%d",&n,&m);
	mkt(1,n,root);
}

void cha(xds *p)
{
	if (p->l>y || p->r<x) return;
	if (p->l>=x && p->r<=y)
	{
		if (p->xiao<ans1[i]) ans1[i]=p->xiao;
		if (p->da>ans2[i]) ans2[i]=p->da;
	}
	else
	{
		cha(p->cl);
		cha(p->cr);
	}
}

void solve()
{
	for (i=1;i<=n-m+1;i++)
	{
		ans1[i]=2000000000;
		ans2[i]=-ans1[i];
		x=i;
		y=i+m-1;
		cha(root);
	}
	for (i=1;i<n-m+1;i++)
		printf("%d ",ans1[i]);
	printf("%d\n",ans1[n-m+1]);
	for (i=1;i<n-m+1;i++)
		printf("%d ",ans2[i]);
	printf("%d\n",ans2[n-m+1]);
}

int main()
{
	init();
	solve();
	return 0;
}