POJ2823 Sliding Window 單調隊列

POJ2823 Sliding Window


注意:

  • k可能大於n
  • 彈出值的時候要二分 , 不然會TLE ; 用 c++ 交可以 5s 卡過測試

AC代碼

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<limits.h>
using namespace std;
#define rep(i,l,p) for(int i =l;i<=p;i++)
#define fread() freopen("in.txt","r",stdin)

struct node
{
    int x,pos;
    node (int _,int __):x(_),pos(__){}
    node(){}
};
struct pi
{
    int l,r;
}pmax,pmin;
node mmax[1000005],mmin[1000005];
int n,k;
vector<int> ans_1,ans_2;
int main(int argc, char const *argv[])
{
    // fread();
    scanf("%d%d",&n,&k);
    if(k>n) k = n;
    if( k == n){
        int res_1 = INT_MAX,res_2 = INT_MIN,t;
        rep(i,1,n){
            scanf("%d",&t);
            res_1 = min(res_1,t);
            res_2 = max(res_2,t);
        }
        printf("%d\n%d\n",res_1,res_2 );
        return 0;

    }
    pmax.l = pmax.r = 0;
    pmin.l = pmin.r = 0;
    rep(i,1,n){
        int t;
        scanf("%d",&t);
        int l = i - k + 1;
        while( pmax.r > pmax.l && mmax[pmax.l+1].pos < l ){
            pmax.l++;
        }
        while( pmin.r > pmin.l && mmin[pmin.l+1].pos < l){
            pmin.l++;
        }


        while( pmax.r > pmax.l && t >= mmax[pmax.r].x ){
            pmax.r--;
        }
        while( pmin.r > pmin.l && t <= mmin[pmin.r].x){
            pmin.r--;
        }
        pmax.r++;
        mmax[pmax.r].x = t;
        mmax[pmax.r].pos = i;

        pmin.r++;
        mmin[pmin.r].x = t;
        mmin[pmin.r].pos = i;

        if(i<k) continue;
        else{
            ans_1.push_back(mmin[pmin.l+1].x);
            ans_2.push_back(mmax[pmax.l+1].x);
        }

    }
    rep(i,0,ans_1.size()-2){
        printf("%d ",ans_1[i]);
    }
    printf("%d\n",ans_1[ans_1.size()-1] );
    rep(i,0,ans_2.size()-2){
        printf("%d ",ans_2[i]);
    }
    printf("%d\n",ans_2[ans_2.size()-1] );
    return 0;
}
發佈了37 篇原創文章 · 獲贊 5 · 訪問量 3668
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章