标签:
用线段树做的,,,,很笨,,,,,,最大最小分开来写的,,,,,,代码很长不过一半是复制下来的了。。。。。
题意就是求每个小区间的最大最小值~
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
#define maxn 222222
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int MIN[maxn<<2];
int MAX[maxn<<2];
void pushup2(int rt)
{
MIN[rt]=min(MIN[rt<<1],MIN[rt<<1|1]);
}
void build2(int l,int r,int rt)
{
if(l==r)
{
return ;
}
int m=(l+r)>>1;
build2(lson);
build2(rson);
pushup2(rt);
}
int query2(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r) return MIN[rt];
int m=(l+r)>>1;
int ret=999999;
if(L<=m) ret=min(ret,query2(L,R,lson));
if(R>m) ret=min(ret,query2(L,R,rson));
return ret;
}
void pushup1(int rt)
{
MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);
}
void build1(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&MAX[rt]);
MIN[rt]=MAX[rt];
return ;
}
int m=(l+r)>>1;
build1(lson);
build1(rson);
pushup1(rt);
}
int query1(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r) return MAX[rt];
int m=(l+r)>>1;
int ret=0;
if(L<=m) ret=max(ret,query1(L,R,lson));
if(R>m) ret=max(ret,query1(L,R,rson));
return ret;
}
int main()
{
int N,Q;
while(scanf("%d%d",&N,&Q)!=EOF)
{
build1(1,N,1);
build2(1,N,1);
for(int i=1;i<=N-Q+1;i++)
{
if(i==1) printf("%d",query2(i,i+Q-1,1,N,1));
else printf(" %d",query2(i,i+Q-1,1,N,1));
}
printf("\n");
for(int i=1;i<=N-Q+1;i++)
{
if(i==1) printf("%d",query1(i,i+Q-1,1,N,1));
else printf(" %d",query1(i,i+Q-1,1,N,1));
}
printf("\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zhangwenchi/article/details/47278667