线段树,前4个点全AC,其他的点全TLE。
#include <bits/stdc++.h>
using namespace std;
#define N 1000020
#define ll long long
#define bol bitset
#define imax INT_MAX
#define imin INT_MIN
#define inf 0x3f3f3f3f
#define B 100000010
#define min(a,b) (a<b ? a:b)
#define max(a,b) (a>b ? a:b)
#define lowbit(x) (x&(-x))
#define lt p*2
#define rt p*2+1
const ll X=4*N;
const ll mod1=1e9+7;
const ll mod2=98244353;
//define大队可以看几个主要的。
struct tree
{
int l,r;
int maxn,minn;
}t[X];
int a[X];
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].maxn=a[l];
t[p].minn=a[l];
return;
}
int mid=(l+r)>>1;
build(lt,l,mid);
build(rt,mid+1,r);
t[p].maxn=max(t[lt].maxn,t[rt].maxn);
t[p].minn=min(t[lt].minn,t[rt].minn);
}
int sum1(int p,int l,int r)
{
if(l<=t[p].l&&t[p].r<=r)
{
return t[p].maxn;
}
int mid=(t[p].l+t[p].r)>>1;
int sum=INT_MIN;
if(l<=mid) sum=max(sum,sum1(lt,l,r));
if(r>mid) sum=max(sum,sum1(rt,l,r));
return sum;
}
int sum2(int p,int l,int r)
{
if(l<=t[p].l&&t[p].r<=r)
{
return t[p].minn;
}
int mid=(t[p].l+t[p].r)>>1;
int sum=INT_MAX;
if(l<=mid) sum=min(sum,sum2(lt,l,r));
if(r>mid) sum=min(sum,sum2(rt,l,r));
return sum;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1,j=m;j<=n;i++,j++)
{
cout<<sum2(1,i,j)<<" ";
}
cout<<"\n";
for(int i=1,j=m;j<=n;i++,j++)
{
cout<<sum1(1,i,j)<<" ";
}
return 0;
}