我用的是朴树的线段树。没有经过优化的。用了9K+ms ,第一次看到这么大的时间。
不知道lazy 该怎么标记。 本来想试一试zkw线段树的,但是不是很熟,写不出来
因为要求最大最小值,一开始我只用了一个query 想同时 得到最大最小,最后发现实现不了。
用了两个函数,一个求最大,一个求最小。得出来了。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <memory.h>
using namespace std;
const int N=1000005;
int Min[N<<2];
int Max[N<<2];
int cnt;
int Max_ans[N];
int Min_ans[N];
inline int max(int a,int b) { return a>b?a:b ; }
inline int min(int a,int b) { return a<b?a:b ; }
void push_up(int rt)
{
Min[rt]=min(Min[rt<<1],Min[rt<<1|1]);
Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&Max[rt]);
Min[rt]=Max[rt];
return ;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
push_up(rt);
}
int query_min(int l,int r,int rt,int L,int R)
{
int ans=1e8;
if(L<=l&&R>=r)
{
return Min[rt];
}
int m=(l+r)>>1;
if(L<=m)
ans=min(ans,query_min(l,m,rt<<1,L,R));
if(R>m)
ans=min(ans,query_min(m+1,r,rt<<1|1,L,R));
return ans;
}
int query_max(int l,int r,int rt,int L,int R)
{
int ans=-1e8;
if(L<=l&&R>=r)
{
return Max[rt];
}
int m=(l+r)>>1;
if(L<=m)
ans=max(ans,query_max(l,m,rt<<1,L,R));
if(R>m)
ans=max(ans,query_max(m+1,r,rt<<1|1,L,R));
return ans;
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
build(1,n,1);
for(int i=1;i+k-1<=n;i++)
{
Max_ans[cnt]=query_max(1,n,1,i,i+k-1);
Min_ans[cnt]=query_min(1,n,1,i,i+k-1);
cnt++;
}
for(int i=0;i<cnt;i++)
printf("%d ",Min_ans[i]);
printf("\n");
for(int i=0;i<cnt;i++)
printf("%d ",Max_ans[i]);
printf("\n");
}
}