POJ 2823 Sliding Window

来源:互联网 发布:三菱plc脉冲输出编程 编辑:程序博客网 时间:2024/05/21 06:46

这里写图片描述
这里写图片描述

题目大意:第一行是n,k,第二行给你n个数字 让你求从i=0开始到i+k这个区间最大值 最小值 之后循环到i+k>n时结束 输出结果第一行是最小值 第二行是最大值

解题思路:此题是一道简单的连更新都没有的线段树,套用线段树模板即可A掉。当然此题也可以用单调队列来做。大家可以去试下,当然线段树的代码最好提交为C++,G++会超时的。

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <map>#include <cmath>#include <queue>#include <string>#include <vector>#include <set>#define ll long long#define N 1000005 <<2#define sc(x) scanf("%d",&x)#define dsc(x,y) scanf("%d%d",&x,&y)#define pr(x) printf("%d\n",x)#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1using namespace std;int sto[N];int sti[N];void PushUp(int rt){    sto[rt]=max(sto[rt<<1],sto[rt<<1|1]);//更新最大值    sti[rt]=min(sti[rt<<1],sti[rt<<1|1]);//更新最小值}void BuildTree(int l,int r,int rt){    if(l==r)    {        sc(sto[rt]);        sti[rt]=sto[rt];        return;    }    int mid=(l+r)>>1;    BuildTree(lson);    BuildTree(rson);    PushUp(rt);}int querymin(int L,int R,int l,int r,int rt)//查询最小值{    if(L<=l&&r<=R)        return sti[rt];    int mid=(l+r)>>1;    int res=1<<25;//取极大值    if(L<=mid)        res=min(res,querymin(L,R,lson));    if(mid<R)        res=min(res,querymin(L,R,rson));        return res;}int querymax(int L,int R,int l,int r,int rt)//查询最大值{    if(L<=l&&r<=R)        return sto[rt];    int mid=(l+r)>>1;    int res=-(1<<25);//取极小值        if(L<=mid)        res=max(res,querymax(L,R,lson));    if(mid<R)        res=max(res,querymax(L,R,rson));        return res;}int main(){    int n,k;    while(~dsc(n,k))    {    BuildTree(1,n,1);    for(int i=0;i+k<=n;i++)    {        printf("%d%c",querymin(i+1,i+k,1,n,1),i+k==n?'\n':' ');//最小值    }    for(int i=0;i+k<=n;i++)    {        printf("%d%c",querymax(i+1,i+k,1,n,1),i+k==n?'\n':' ');//最大值    }    }    return 0;}

END!!!!!!!!!!!!!!!!!!!!

2 0
原创粉丝点击