POJ 2823 Sliding Window

来源:互联网 发布:dota2 6.88狂战爷数据 编辑:程序博客网 时间:2024/06/06 01:26

哭继续复习线段树。找女朋友浪费时间啊。课程全部落下拉。

这是标准的模版题。输出区间最小与区间最大。

AC代码

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MaxF=10000000;const int MinF=-10000000;int n,ql,qr;int a[5000001];int minv[20000001];int maxv[20000001];int querymin(int l,int r,int o){    int m=(l+r)>>1,ans=MaxF;    if(ql<=l&&r<=qr)return minv[o];    if(ql<=m)ans=min(ans,querymin(l,m,o*2));    if(qr>m)ans=min(ans,querymin(m+1,r,o*2+1));    return ans;}int querymax(int l,int r,int o){    int m=(l+r)>>1,ans=MinF;    if(ql<=l&&r<=qr)return maxv[o];    if(ql<=m)ans=max(ans,querymax(l,m,o*2));    if(qr>m)ans=max(ans,querymax(m+1,r,o*2+1));    return ans;}int buildmin(int l,int r,int o){    int m=(l+r)>>1;    if(l<r)    {        minv[o]=min(buildmin(l,m,o*2),buildmin(m+1,r,o*2+1));    }    else    minv[o]=a[m];    return minv[o];}int buildmax(int l,int r,int o){    int m=(l+r)>>1;    if(l<r)    {        maxv[o]=max(buildmax(l,m,o*2),buildmax(m+1,r,o*2+1));    }    else    maxv[o]=a[m];    return maxv[o];}int main(){    int m;    while(~scanf("%d%d",&n,&m))    {        for(int i=1;i<=n;i++)        scanf("%d",&a[i]);        buildmin(1,n,1);        buildmax(1,n,1);        for(ql=1,qr=ql+m-1;qr<n;ql++,qr++)        {            printf("%d ",querymin(1,n,1));        }printf("%d\n",querymin(1,n,1));        for(ql=1,qr=ql+m-1;qr<n;ql++,qr++)        {            printf("%d ",querymax(1,n,1));        }printf("%d\n",querymax(1,n,1));    }}


0 0