记录编号 523077 评测结果 AAAAAAAAA
题目名称 [POJ 2823]滑动窗口 最终得分 100
用户昵称 GravatarHale 是否通过 通过
代码语言 C++ 运行时间 1.460 s
提交时间 2018-11-17 20:02:55 内存使用 83.27 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int m,n,k,l,o;
int a[1000010];
int d1[1000010][10];
int d2[1000010][10]; 
void add_init(int n)
{ for (int i=1;i<=n;i++)
  d2[i][0]=a[i];
  for(int j=1;(1<<j)<=n;j++)
   for (int i=1;i+(1<<j)-1<=n;i++)
  d2[i][j]=max(d2[i][j-1],d2[i+(1<<(j-1))][j-1]);
}
void add_innit(int n)
{ for (int i=1;i<=n;i++)
  d1[i][0]=a[i];
  for(int j=1;(1<<j)<=n;j++)
   for (int i=1;i+(1<<j)-1<=n;i++)
  d1[i][j]=min(d1[i][j-1],d1[i+(1<<(j-1))][j-1]);
}
int RMQ(int r,int l)
{ int k=0;
  while ((1<<(k+1))<=l-r+1) k++;
  return max(d2[r][k],d2[l-(1<<k)+1][k]);
}
int RMQ2(int r,int l)
{int k=0;
  while ((1<<(k+1))<=l-r+1) k++;
  return min(d1[r][k],d1[l-(1<<k)+1][k]);
}
int main()
{ freopen("window.in","r",stdin);
  freopen("window.out","w",stdout);
  scanf("%d%d",&m,&l);
  for (int i=1;i<=m;i++)
  scanf("%d",&a[i]);
  add_init(m);
  add_innit(m);
  for (int i=l;i<=m;i++)
  printf("%d ",RMQ2(i-l+1,i));
  printf("\n");
  for (int i=l;i<=m;i++)
  { printf("%d ",RMQ(i-l+1,i));
  }
  return 0;
}