zoukankan      html  css  js  c++  java
  • 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)

    To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window

    题目描述

    现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

    例如:

    The array is [1 3 -1 -3 5 3 6 7], and k = 3.

    输入输出格式

    输入格式:

    输入一共有两行,第一行为n,k。

    第二行为n个数(<INT_MAX).

    输出格式:

    输出共两行,第一行为每次窗口滑动的最小值

    第二行为每次窗口滑动的最大值

    输入输出样例

    输入样例#1:
    8 3
    1 3 -1 -3 5 3 6 7
    输出样例#1:
    -1 -3 -3 -3 3 3
    3 3 5 5 6 7

    说明

    50%的数据,n<=10^5

    100%的数据,n<=10^6

    代码:

    洛谷70分TLE的线段树

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int N=1000005;
     5 
     6 int n,k,From,To,Min[N<<2],Max[N<<2];
     7 
     8 void read(int &now)
     9 {
    10     now=0;int f=1;char c=getchar();
    11     while(c<'0'||c>'9')
    12     {
    13         if(c=='-')f=-1;
    14         c=getchar();
    15     }
    16     while(c>='0'&&c<='9')now=now*10+c-'0',c=getchar();
    17     now*=f;
    18 }
    19 
    20 inline void PushUp(int rt)
    21 {
    22     Min[rt]=min(Min[rt<<1],Min[rt<<1|1]);
    23     Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
    24 }
    25 
    26 void Build(int l,int r,int rt)
    27 {
    28     if(l==r)
    29     {
    30         int t;
    31         read(t);
    32         Min[rt]=Max[rt]=t;
    33         return;
    34     }
    35     int m=(l+r)>>1;
    36     Build(l,m,rt<<1);
    37     Build(m+1,r,rt<<1|1);
    38     PushUp(rt);
    39 }
    40 
    41 int QueryMax(int l,int r,int rt,int L,int R)
    42 {
    43     if(L<=l && r<=R) return Max[rt];
    44     int m=(l+r)>>1,res=(1<<31);
    45     if(L<=m) res=max(res,QueryMax(l,m,rt<<1,L,R));
    46     if(m<R) res=max(res,QueryMax(m+1,r,rt<<1|1,L,R));
    47     return res;
    48 }
    49 
    50 int QueryMin(int l,int r,int rt,int L,int R)
    51 {
    52     if(L<=l && r<=R) return Min[rt];
    53     int m=(l+r)>>1,res=(1<<30);
    54     if(L<=m) res=min(res,QueryMin(l,m,rt<<1,L,R));
    55     if(m<R) res=min(res,QueryMin(m+1,r,rt<<1|1,L,R));
    56     return res;
    57 }
    58 
    59 int main()
    60 {
    61     read(n);read(k);
    62     Build(1,n,1);
    63     //From=1;To=k;
    64     for(register int i=1;i<=n-k+1;i++)//,From++,To++
    65       printf("%d ",QueryMin(1,n,1,i,i+k-1));
    66     printf("
    ");
    67     //From=1;To=k;
    68     for(register int i=1;i<=n-k+1;i++)//,From++,To++
    69       printf("%d ",QueryMax(1,n,1,i,i+k-1));
    70     return 0;
    71 }
    TLE

    常数优化十分可观的zkw线段树(然而我不会用)

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int N=1000005;
     5 
     6 int n,k,M,Tree[N<<2];
     7 
     8 void read(int &now)
     9 {
    10     now=0;int f=1;char c=getchar();
    11     while(c>'9'||c<'0')
    12     {
    13         if(c=='-')f=-1;
    14         c=getchar();
    15     }
    16     while(c>='0'&&c<='9')now=(now<<3)+(now<<1)+c-'0',c=getchar();
    17     now*=f;
    18 }
    19 
    20 void BuildMin(int n)
    21 {
    22     for(int i=M-1;i;--i)
    23       Tree[i]=min(Tree[i<<1],Tree[i<<1|1]);
    24 }
    25 
    26 void BuildMax(int n)
    27 {
    28     for(int i=M-1;i;--i)
    29       Tree[i]=max(Tree[i<<1],Tree[i<<1|1]);
    30 }
    31 
    32 int QueryMin(int s,int t,int res)
    33 {
    34     for(s+=M,t+=M;s^t^1;s>>=1,t>>=1)
    35     {
    36         if(~s&1) res=min(res,Tree[s^1]);
    37         if(t&1) res=min(res,Tree[t^1]);
    38     }
    39     return res;
    40 }
    41 
    42 int QueryMax(int s,int t,int res)
    43 {
    44     for(s+=M,t+=M;s^t^1;s>>=1,t>>=1)
    45     {
    46         if(~s&1) res=max(res,Tree[s^1]);
    47         if(t&1) res=max(res,Tree[t^1]);
    48     }
    49     return res;
    50 }
    51 
    52 int main()
    53 {
    54     read(n);read(k);
    55     for(M=1;M<=n+1;M<<=1);
    56     for(int i=M+1;i<=M+n;i++)
    57       read(Tree[i]);
    58     BuildMin(n);
    59     for(int i=0;i<=n-k;++i)
    60       printf("%d ",QueryMin(i,i+k+1,1e9));
    61     printf("
    ");
    62     BuildMax(n);
    63     for(int i=0;i<=n-k;++i)
    64       printf("%d ",QueryMax(i,i+k+1,-1e9));
    65     return 0;
    66 }
    AC
  • 相关阅读:
    (转)STMFD和LDMFD指令个人理解分析
    [原创] linux下的串口调试工具
    详解Makefile 函数的语法与使用 (转)
    sed命令详解(转)
    [转]QT4解决中文乱码(tr的使用 | QTextCodec)
    新型的按键扫描程序,仅三行程序(转)
    VS2010旗舰版不能安装Silverlight4_Tools的解决方案
    ASP.NET MVC3+EF4+Oracle入门实例(六)
    一个ASP.NET文件下载类
    项目管理实践【四】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】
  • 原文地址:https://www.cnblogs.com/SovietPower/p/6893690.html
Copyright © 2011-2022 走看看