记录编号 |
21697 |
评测结果 |
AAAAAAAAA |
题目名称 |
[POJ 2823]滑动窗口 |
最终得分 |
100 |
用户昵称 |
Pom |
是否通过 |
通过 |
代码语言 |
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;
}