zoukankan      html  css  js  c++  java
  • poj2823Sliding Window(线段树求最值)

    链接

    裸线段树 这题时间卡的挺棒

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 
     7 using namespace std;
     8 #define N 1000010
     9 #define INF 0xfffffff
    10 int s[N<<2],lm[N<<2],sm[N<<2];
    11 int ma[N],mi[N],o;
    12 void up(int l,int r,int w)
    13 {
    14     lm[w] = min(lm[w<<1],lm[w<<1|1]);
    15     sm[w] = max(sm[w<<1],sm[w<<1|1]);
    16 }
    17 void build(int l,int r,int w)
    18 {
    19     if(l==r)
    20     {
    21         scanf("%d",&s[w]);
    22         lm[w] = sm[w] = s[w];
    23         return ;
    24     }
    25     int m = (l+r)>>1;
    26     build(l,m,w<<1);
    27     build(m+1,r,w<<1|1);
    28     up(l,r,w);
    29 }
    30 int query1(int a,int b,int l,int r,int w)
    31 {
    32     if(a<=l&&b>=r)
    33     {
    34         return lm[w];
    35     }
    36     int m = (l+r)>>1,ans = INF;
    37     if(a<=m)
    38     ans = query1(a,b,l,m,w<<1);
    39     if(b>m)
    40     ans = min(ans,query1(a,b,m+1,r,w<<1|1));
    41     return ans;
    42 }
    43 int query2(int a,int b,int l,int r,int w)
    44 {
    45     if(a<=l&&b>=r)
    46     {
    47         return sm[w];
    48     }
    49     int m = (l+r)>>1,ans = -INF;
    50     if(a<=m)
    51     ans = query2(a,b,l,m,w<<1);
    52     if(b>m)
    53     ans = max(ans,query2(a,b,m+1,r,w<<1|1));
    54     return ans;
    55 }
    56 int main()
    57 {
    58     int i,n,k;
    59     while(scanf("%d%d",&n,&k)!=EOF)
    60     {
    61         build(1,n,1);
    62         o = 1;
    63         mi[1] = query1(1,k,1,n,1);
    64         ma[1] = query2(1,k,1,n,1);
    65         for(i = 2; i <= n-k+1 ; i++)
    66         {
    67             o++;
    68             mi[o] = query1(i,i+k-1,1,n,1);
    69             ma[o] = query2(i,i+k-1,1,n,1);
    70         }
    71         for(i = 1; i < o ; i++)
    72         printf("%d ",mi[i]);
    73         printf("%d
    ",mi[o]);
    74         for(i = 1; i < o ; i++)
    75         printf("%d ",ma[i]);
    76         printf("%d
    ",ma[o]);
    77     }
    78     return 0;
    79 }
    View Code
  • 相关阅读:
    洛谷P2045 K方格取数(算竞进阶习题)
    洛谷P2764 最小路径覆盖问题
    BZOJ 1051 受欢迎的牛
    BZOJ 4196 软件包管理器
    跨域知识(一)——CORS
    CSS 实现隐藏滚动条同时又可以滚动
    数组map用法总结
    js和Jquery获取选中select值和文本
    closest和parents方法区别
    CSS面试题总结2(转)
  • 原文地址:https://www.cnblogs.com/shangyu/p/3324076.html
Copyright © 2011-2022 走看看