zoukankan      html  css  js  c++  java
  • poj2823/hdu3415

    poj2823 题目链接

    长度为N的数组,求宽度k的滑动窗口在数组上滑动时窗口内的最大值或最小值

    如果用单调队列做,求最小值时,队列应该严格递增的。所以插入时,队尾大于等于插入值的元素都应被舍弃,因为插入元素不仅小而且新,没有必要保留队尾这些又大又旧的元素。

    /*
    选C++交是5k多毫秒,但是G++就会超时。
    */
    #include <cstdio> #include <cstring> const int N = 1000100; int data[N]; int o1[N],o2[N]; int q[N]; int n,k; void getMin(){ int head,tail; head = tail = 0; for(int i=0;i<n;i++){ while((tail>head)&&data[q[tail-1]]>data[i]) tail--; q[tail++] = i; if(i>=(k-1)){ while((head<tail)&&q[head]<(i-k+1)) head++; o1[i-k+1] = data[q[head]]; } } } void getMax(){ int head,tail; head = tail = 0; for(int i=0;i<n;i++){ while((head<tail)&&(data[q[tail-1]]<data[i])) tail--; q[tail++] = i; if(i>=(k-1)){ while((head<tail)&&(q[head]<(i-k+1))) head++; o2[i-k+1] = data[q[head]]; } } } int main(){ scanf("%d%d",&n,&k); for(int i=0;i<n;i++) scanf("%d",data+i); getMin(); getMax(); for(int i=0;i<n-k+1;i++) printf("%d ",o1[i]); puts(""); for(int i=0;i<n-k+1;i++) printf("%d ",o2[i]); puts(""); return 0; }

     hdu3415 题目链接

    长度为N的数组,长度小于等于K的非空子串的最大和。

    求完前缀和后就转化成了窗宽为k的单调队列

    #include <cstdio>
    #include <cstring>
    const int N = 100100;
    const int INF = 0x0FFFFFFF;
    int data[N],sum[N*2];
    int q[N*2];
    int n,k,total;
    int minq(int &spos,int &epos){
        int head,tail;
        head = tail = 0;
        int ans = -INF;
        for(int i=1;i<total;i++){
            while((head<tail)&&(sum[q[tail-1]]>=sum[i-1])) tail--;
            while((head<tail)&&q[head]<i-k) head++;
            q[tail++] = i-1;
            if((sum[i]-sum[q[head]]>ans)){
                spos = q[head];
                epos = i;
                ans = sum[epos]-sum[spos];
            }
        }
        return ans;
    }
    int main(){
        int t;
        for(scanf("%d",&t);t--;){
            scanf("%d%d",&n,&k);
            sum[0] = 0;
            for(int i=1;i<=n;i++){
                scanf("%d",data+i);
                sum[i]=sum[i-1]+data[i];
            }
            for(int i=1;i<k;i++) sum[n+i]=sum[n+i-1]+data[i];
            
            total = n+k;
            int spos,epos;
            int ans = minq(spos,epos);
            spos++;
            if(epos>n) epos-=n;
            if(spos>n) spos-=n;
            printf("%d %d %d
    ",ans,spos,epos);
        }
        return 0;
    } 
  • 相关阅读:
    git 学习网站
    Vue 部署在 IIS 上
    Element UI 的坑
    Vue 中 Prop 传至的 一个Bug
    Asp.net Core 部署在 IIS上
    今天用UniApp开发, 用到 Vuex 中的 mutations, 设置值的时候好像只能传2个参数, 第一个是固定的state, 第二个是一个值, 不能传第三个了
    anxios 和 uni.request 访问Asp.net 服务器传参出错的坑
    内网计算机设置问题说明
    关于综合布线
    Android学习 -- Activity 以及Activity之间值传递
  • 原文地址:https://www.cnblogs.com/redips-l/p/6770274.html
Copyright © 2011-2022 走看看