zoukankan      html  css  js  c++  java
  • Sliding Window

    poj2823:http://poj.org/problem?id=2823

    题意:给出一个序列,要求得到所有长度为k的连续子序列的最大和最小值。
    题解:直接上线段树

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 using namespace std;
     6 const int maxn=1000002;
     7 int n,k,s;
     8 struct  Node{
     9     int left;
    10     int right;
    11     int minn;
    12     int maxn;
    13 }node[4*maxn];
    14 void build(int l,int r,int idx){
    15     node[idx].left=l;
    16     node[idx].right=r;
    17     if(l==r){
    18         scanf("%d",&s);
    19         node[idx].minn=s;
    20         node[idx].maxn=s;
    21         return;
    22     }
    23     int mid=(l+r)/2;
    24     build(l,mid,idx*2);
    25     build(mid+1,r,idx*2+1);
    26     node[idx].maxn=max(node[idx*2].maxn,node[idx*2+1].maxn);
    27     node[idx].minn=min(node[idx*2].minn,node[idx*2+1].minn);
    28 }
    29 int queryminn(int s,int t,int idx){
    30     if(node[idx].left==s&&node[idx].right==t){
    31         return node[idx].minn;
    32     }
    33     int mid=(node[idx].left+node[idx].right)/2;
    34     if(mid>=t)return queryminn(s,t,idx*2);//范围只能这么写,否则会出错 
    35     else if(mid<s)return queryminn(s,t,idx*2+1);
    36     else 
    37       return min(queryminn(s,mid,idx*2),queryminn(mid+1,t,idx*2+1));
    38 }
    39 int querymaxnn(int s,int t,int idx){
    40     if(node[idx].left==s&&node[idx].right==t){
    41         return node[idx].maxn;
    42     }
    43     int mid=(node[idx].left+node[idx].right)/2;
    44     if(mid>=t)return querymaxnn(s,t,idx*2);
    45     else if(mid<s)return querymaxnn(s,t,idx*2+1);
    46     else 
    47       return max(querymaxnn(s,mid,idx*2),querymaxnn(mid+1,t,idx*2+1));
    48 }
    49 int main(){
    50     while(~scanf("%d%d",&n,&k)){
    51         build(1,n,1);
    52         for(int i=1;i+k<=n+1;i++){
    53             printf("%d ",queryminn(i,k+i-1,1));
    54         }
    55         printf("
    ");
    56         for(int i=1;i+k<=n+1;i++){
    57             printf("%d ",querymaxnn(i,k+i-1,1));
    58         }
    59         printf("
    ");
    60     }
    61 }
    View Code
  • 相关阅读:
    (Vedctor经典)A
    C++ map用法
    (约瑟夫应用)5.4.1 Roman Roulette
    部分题集代码
    随机生成数
    如何在AutoCAD中实现鼠标双击事件
    浅谈JS之Error对象
    自定义微信小程序swiper轮播图面板指示点的样式
    物理像素与逻辑像素相关概念
    微信小程序中padding-right和margin-right无效
  • 原文地址:https://www.cnblogs.com/chujian123/p/3402107.html
Copyright © 2011-2022 走看看