原题:POJ-2823
一个线段树求区间最大最小
很基础的一个题目
#include <iostream>
#include <cstdio>
using namespace std;
int n,k;
int a[1000100];
int in[1000100],ax[1000100];
struct node {
int mmax,mmin,l,r;
node *lson,*rson;
};
void buildtree(node *temp,int l,int r) {
if(l==r) {
temp->mmax=a[r];
temp->mmin=a[r];
temp->l=l;
temp->r=l;
temp->lson=NULL;
temp->rson=NULL;
return ;
}
int mid=(l+r)/2;
temp->lson=new node;
temp->rson=new node;
buildtree(temp->lson,l,mid);
buildtree(temp->rson,mid+1,r);
temp->l=l;
temp->r=r;
temp->mmax=max(temp->lson->mmax,temp->rson->mmax);
temp->mmin=min(temp->lson->mmin,temp->rson->mmin);
return ;
}
void updata(node *node,int t,int value,int l,int r) {
if(l==r&&t==l) {
node->mmax=value;
node->mmin=value;
return ;
}
int mid=(l+r)/2;
if(t<=mid)
updata(node->lson,t,value,l,mid);
else
updata(node->rson,t,value,mid+1,r);
node->mmax=max(node->lson->mmax,node->rson->mmax);
node->mmin=min(node->lson->mmin,node->rson->mmin);
}
int main() {
int i;
while(~scanf("%d %d",&n,&k)) {
for(i=0; i<n; i++)
scanf("%d",&a[i]);
node *head=new node;
buildtree(head,0,k-1);
in[0]=head->mmin;
ax[0]=head->mmax;
for(i=0; i<=n-k; i++) {
updata(head,i%k,a[k+i],0,k-1);
in[i+1]=head->mmin;
ax[i+1]=head->mmax;
}
for(i=0; i<n-k; i++)
printf("%d ",in[i]);
printf("%d\n",in[i]);
for(i=0; i<n-k; i++)
printf("%d ",ax[i]);
printf("%d\n",ax[i]);
}
return 0;
}