POJ 2823线段树水

来源:互联网 发布:听课软件哪个好 编辑:程序博客网 时间:2024/05/01 19:47

RMQ问题

线段树水过:

#include "stdio.h"#include "string.h"#include "stdlib.h"int Min[1000010],Max[1000010];struct node{    int l,r,Max,Min;}data[4000010];void build(int l,int r,int k){    int mid;    data[k].l=l;    data[k].r=r;    if (l==r)    {        scanf("%d",&data[k].Max);        data[k].Min=data[k].Max;        return ;    }    mid=(l+r)/2;    build(l,mid,k*2);    build(mid+1,r,k*2+1);    if (data[k*2].Max>data[k*2+1].Max) data[k].Max=data[k*2].Max;    else data[k].Max=data[k*2+1].Max;    if (data[k*2].Min<data[k*2+1].Min) data[k].Min=data[k*2].Min;    else data[k].Min=data[k*2+1].Min;}int query(int l,int r,int k,int op){    int x,y,mid;    if (data[k].l==l && data[k].r==r)    {        if (op==1) return data[k].Max;        else return data[k].Min;    }    mid=(data[k].l+data[k].r)/2;    if (r<=mid) return query(l,r,k*2,op);    else if (l>mid) return query(l,r,k*2+1,op);    else    {        x=query(l,mid,k*2,op);        y=query(mid+1,r,k*2+1,op);        if(op==1)        {            if (x>y) return x; else return y;        }        else        {            if (x<y) return x; else return y;        }    }}int main(){    int n,m,i;    while (scanf("%d%d",&n,&m)!=EOF)    {        build(1,n,1);        for (i=1;i<=n-m+1;i++)        {            Max[i]=query(i,i+m-1,1,1);            Min[i]=query(i,i+m-1,1,0);        }        for (i=1;i<n-m+1;i++)            printf("%d ",Min[i]);        printf("%d\n",Min[i]);        for (i=1;i<n-m+1;i++)            printf("%d ",Max[i]);        printf("%d\n",Max[i]);    }    return 0;}


0 0