求从头到尾所有相邻三个数中最大者并输出。范围略大,直接算应该超时。线段树查询完成。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int N=25005;
int s[N];
int mx[N<<2];
void Insert(int v,int i,int l,int r,int rt)
{
mx[rt]=max(mx[rt],v);
if(l==r)return;
int m=(l+r)>>1;
if(i<=m)Insert(v,i,lson);
else Insert(v,i,rson);
}
int query(int z,int y,int l,int r,int rt)
{
if(z<=l&&y>=r)return mx[rt];
int m=(l+r)>>1;
int mxv=0;
if(z<=m)mxv=max(mxv,query(z,y,lson));
if(y>m)mxv=max(mxv,query(z,y,rson));
return mxv;
}
int main()
{
memset(mx,0,sizeof(mx));
int m;
scanf("%d",&m);
int n;
int i;
for(i=1;scanf("%d",&s[i]),s[i]!=-1;i++);
n=i-1;
for(i=1;i<=n;i++)
Insert(s[i],i,1,n,1);
for(i=1;i<=n-m+1;i++)
{
printf("%d\n",query(i,i+m-1,1,n,1));
}
return 0;
}