• poj 2823单调队列模板题


    #include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃
    #define N  1100000
    int getmin[N],getmax[N],num[N],n,k,a[N];
    int main(){
    int i,first,last;
    while(scanf("%d%d",&n,&k)!=EOF) {
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    first=1;last=1;
    getmin[first]=a[1];
    num[first]=1;
    for(i=2;i<=k;i++) {
    while(a[i]<=getmin[last]&&first<=last)
    last--;
    getmin[++last]=a[i];
    num[last]=i;
    }
    printf("%d",getmin[first]);
    for(i=k+1;i<=n;i++) {
    while(a[i]<=getmin[last]&&first<=last)//碰到相等也要改变因为他生命长
    last--;
    getmin[++last]=a[i];
    num[last]=i;
    while(num[first]<i-k+1&&first<=last)//如果没有在要求的范围内就舍弃
    first++;
    printf(" %d",getmin[first]);
    }
    printf(" ");
    first=1;last=1;
    getmax[first]=a[1];
    num[first]=1;
    for(i=2;i<=k;i++) {
    while(a[i]>=getmax[last]&&first<=last)
    last--;
    getmax[++last]=a[i];
    num[last]=i;
    }
    printf("%d",getmax[first]);
    for(i=k+1;i<=n;i++) {
    while(a[i]>=getmax[last]&&first<=last)
    last--;
    getmax[++last]=a[i];
    num[last]=i;
    while(num[first]<i-k+1&&first<=last)
    first++;
    printf(" %d",getmax[first]);
    }
    printf(" ");
    }
    return 0;

    }

    //二分法

    #include<stdio.h>
    struct node {
    int index,f;
    }pmax[1100000],pmin[1100000];
    int a[1100000];
    int qiulinjie(int front ,int last,int d) {
    int mid;
    while(front<=last) {
    mid=(front+last)/2;
    if(pmin[mid].f==d)
    return mid;
    else
    if(pmin[mid].f>d)
    last=mid-1;
    else
    front=mid+1;
    }
    return front;
    }
    int qiulinjie1(int front ,int last,int d) {
    int mid;
    while(front<=last) {
    mid=(front+last)/2;
    if(pmax[mid].f==d)
    return mid;
    else
    if(pmax[mid].f<d)
    last=mid-1;
    else
    front=mid+1;
    }
    return front;
    }
    int main() {
    int front,last,i,j,k,n,m;
    while(scanf("%d%d",&n,&k)!=EOF) {
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    front=last=1;
    pmin[front].index=1;
     pmin[last].f=a[1];
     for(i=2;i<=k;i++) {
     last=qiulinjie(front,last,a[i]);
     pmin[last].index=i;
     pmin[last].f=a[i];
     }
     printf("%d",pmin[front].f);
     for(;i<=n;i++) {
     last=qiulinjie(front,last,a[i]);
     pmin[last].index=i;
     pmin[last].f=a[i];
     while(i-pmin[front].index>=k)
     front++;
     printf(" %d",pmin[front].f);
     }
    printf(" ");




    front=last=1;
    pmax[front].index=1;
     pmax[front].f=a[1];
     for(i=2;i<=k;i++) {
     last=qiulinjie1(front,last,a[i]);
     pmax[last].index=i;
     pmax[last].f=a[i];
     }
     printf("%d",pmax[front].f);
     for(;i<=n;i++) {
     last=qiulinjie1(front,last,a[i]);
     pmax[last].index=i;
     pmax[last].f=a[i];
     while(i-pmax[front].index>=k)
     front++;
     printf(" %d",pmax[front].f);
     }
     printf(" ");
    }
     return 0;
    }

      


  • 相关阅读:
    排查oom方法
    逃逸分析-栈上分配
    java堆是分配对象的唯一选择吗
    GC
    jvm为什么把-Xms和-Xmx的值设置成一样
    java堆
    java为何使用native 方法
    linux top命令信息详解
    java定位系统性能问题
    struts 初体验
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410873.html
Copyright © 2020-2023  润新知