继续复习线段树。找女朋友浪费时间啊。课程全部落下拉。
这是标准的模版题。输出区间最小与区间最大。
AC代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MaxF=10000000;
const int MinF=-10000000;
int n,ql,qr;
int a[5000001];
int minv[20000001];
int maxv[20000001];
int querymin(int l,int r,int o)
{
int m=(l+r)>>1,ans=MaxF;
if(ql<=l&&r<=qr)return minv[o];
if(ql<=m)ans=min(ans,querymin(l,m,o*2));
if(qr>m)ans=min(ans,querymin(m+1,r,o*2+1));
return ans;
}
int querymax(int l,int r,int o)
{
int m=(l+r)>>1,ans=MinF;
if(ql<=l&&r<=qr)return maxv[o];
if(ql<=m)ans=max(ans,querymax(l,m,o*2));
if(qr>m)ans=max(ans,querymax(m+1,r,o*2+1));
return ans;
}
int buildmin(int l,int r,int o)
{
int m=(l+r)>>1;
if(l<r)
{
minv[o]=min(buildmin(l,m,o*2),buildmin(m+1,r,o*2+1));
}
else
minv[o]=a[m];
return minv[o];
}
int buildmax(int l,int r,int o)
{
int m=(l+r)>>1;
if(l<r)
{
maxv[o]=max(buildmax(l,m,o*2),buildmax(m+1,r,o*2+1));
}
else
maxv[o]=a[m];
return maxv[o];
}
int main()
{
int m;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
buildmin(1,n,1);
buildmax(1,n,1);
for(ql=1,qr=ql+m-1;qr<n;ql++,qr++)
{
printf("%d ",querymin(1,n,1));
}printf("%d\n",querymin(1,n,1));
for(ql=1,qr=ql+m-1;qr<n;ql++,qr++)
{
printf("%d ",querymax(1,n,1));
}printf("%d\n",querymax(1,n,1));
}
}