1. 程式人生 > >POJ 2823 Sliding Window 線段樹求解

POJ 2823 Sliding Window 線段樹求解

題目連結:http://poj.org/problem?id=2823

題意:就是求區間最小值。

此題,顯然可以用線段樹過,但是,知道此題是學習滑動視窗時。此題用滑動視窗做的話比較省程式碼,記憶體和時間。但是要是真正到了賽場上,可能真的不太能想起用滑動視窗,而且對單調佇列也不是很熟悉。寫一下線段樹也還是不錯的。

程式碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 1000010

using namespace std;

struct node{
    int l,r,Min,Max;
}T[maxn*3];

int A[maxn],B[maxn],C[maxn],N,K;

void build(int L,int R,int o){
    T[o].l=L;T[o].r=R;//居然把這裡給忘了
    if(L==R){
        T[o].Min=T[o].Max=A[L];return;
    }
    int tx,ttx,ty,tty;
    build(L,(L+R)/2,o*2);
    build((L+R)/2+1,R,o*2+1);
    T[o].Min=min(T[o*2].Min,T[o*2+1].Min);
    T[o].Max=max(T[o*2].Max,T[o*2+1].Max);
}

void query(int L,int R,int &x,int &y,int o){
    if(T[o].l>=L && T[o].r<=R){
        x=T[o].Min;y=T[o].Max;
        return;
    }
    if(T[o].l==T[o].r) return;//居然把這裡也給忘了
    if(L>=T[o*2+1].l) query(L,R,x,y,o*2+1);
    else if(R<=T[o*2].r) query(L,R,x,y,o*2);
    else{
        int tx,ty,ttx,tty;
        query(L,T[o*2].r,tx,ty,o*2);
        query(T[o*2+1].l,R,ttx,tty,o*2+1);
        x=min(tx,ttx);y=max(ty,tty);
    }
}

int main(){
    cin>>N>>K;
    for(int i=1;i<=N;i++) scanf("%d",A+i);
    int a,b,cnt=0;
    build(1,N,1);
    for(int i=K;i<=N;i++){
        query(i-K+1,i,a,b,1);
        B[cnt]=a;C[cnt]=b;cnt++;
    }
    for(int i=0;i<cnt;i++)
        printf("%d%c",B[i],i==cnt-1? '\n':' ');
    for(int i=0;i<cnt;i++)
        printf("%d%c",C[i],i==cnt-1? '\n':' ');
    return 0;
}


相關推薦

POJ 2823 Sliding Window 線段求解

題目連結:http://poj.org/problem?id=2823 題意:就是求區間最小值。 此題,顯然可以用線段樹過,但是,知道此題是學習滑動視窗時。此題用滑動視窗做的話比較省程式碼,記憶體和時間。但是要是真正到了賽場上,可能真的不太能想起用滑動視窗,而且對單調佇列也

poj 2823 Sliding Window 線段

Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 50906 Accepted: 14640 Case Time Limit: 5000MS Des

POJ 2823 Sliding Window(單調佇列||線段

題意: 讓你不停的查詢區間長度為k的最小值和最大值 一開始用set模擬,發現常熟太大,T了,然後開始學單調佇列,看了一會兒還是好理解的,所以就寫了,發現G++會T,只能交C++,後來發現 有人線段樹也能過,於是就寫了一發,還真行,只不過就是吧

POJ 2823 Sliding Window(單調佇列 || 線段)題解

題意:求每個長度為k的陣列的最大值和最小值思路:1.用線段樹建立維護最大值和最小值,遍歷詢問,簡單複習了一下...有點手生2.單調佇列:可以看一下詳解單調佇列顧名思義就是一個單調遞增或者遞減的佇列,我們可以通過佇列瞬間得到當前佇列的最大值和最小值。以查詢當前區間最小值為例,我

洛谷P1886 滑動窗口(POJ.2823 Sliding Window)(區間最值)

最大 ide dma include names target org void blog To 洛谷.1886 滑動窗口 To POJ.2823 Sliding Window 題目描述 現在有一堆數字共N個數字(N<=10^6),以及一個大小為k的窗口。現在這個

POJ 2823 Sliding Window? (模板題)【單調隊列】

返回 一個 color www. 新元素 arc 維護 記錄 一段 <題目鏈接> <轉載於>>> > 題目大意: 給你一段序列和一個長為k的窗口,這個窗口從最左邊逐漸向右滑,直到滑到最右邊,問你,該窗口在滑動的過程中,最大值和最小值

POJ - 2823 Sliding Window【單調佇列優化dp && c++快讀】

Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 72718 &nb

POJ-2823-Sliding Window (單調佇列)

原題連結: http://poj.org/problem?id=2823 An array of size n ≤ 10 6 is given to you. There is a sliding window of size k which is moving from the ver

單調佇列 POJ 2823 Sliding Window

  Sliding Window An array of size n ≤ 10 6 is given to you. There is a sliding window of size kwhich is moving from

POJ 2823 Sliding Window【RMQ壓縮(長度確定)】

題意:給一個長度為N的陣列,輸出所有區間長度為K的陣列元素的最大值與最小值; AC程式碼: #include<cstdio> #include<algorithm> u

POJ 2823 Sliding Window (單調佇列)

題目連結 Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the v

2823 Sliding Window (單調佇列求解區間最值)

POJ - 2823 Time Limit: 12000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Descri

POJ 2823 Sliding Window(單調佇列入門題)

Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 67218 Accepted: 19088 Case Time Limit: 5000MS Description An array of size 

Poj 2823 Sliding Window【單調佇列學習】模板記錄

Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 62889 Accepted: 17951 Case Time Limit: 5000MS Descripti

POJ 2823 Sliding Window(單調佇列)

題意  長度為n的陣列上有個長度為k的滑窗從左向右移動  求每次移動後滑窗區間的最小值和最大值  輸出兩行  第一行所有最小值  第二行所有最大值 可以用線段樹來做  但是單調佇列更簡單  單調遞增佇列: 隊尾單調入隊(入隊元素大於隊尾元素時直接入隊  否則隊尾出隊直到隊尾

POJ 2823 Sliding Window(經典單調佇列)

An array of size n ≤ 10 6 is given to you. There is a sliding window of size kwhich is moving from the very left of the array to the ve

POJ 2823 Sliding Window (單調佇列)@

An array of size n ≤ 10 6 is given to you. There is a sliding window of size kwhich is moving from the very left of the array to the ve

poj 2823 Sliding Window(單調佇列模板)

介紹單調佇列不錯的部落格:點選開啟連結 還有這題輸出用printf G++交會T,C++就能過.....而用cout兩個都能過..好坑.... 程式碼: #include<cstdio> using namespace std; const int maxn

2823 Sliding Window 求區間最值 線段好慢,能用單調佇列

Sliding WindowTime Limit: 12000MSMemory Limit: 65536KTotal Submissions: 14533Accepted: 4096Case Time Limit: 5000MSDescriptionAn array of s

POJ 題目2823 Sliding Window(RMQ,固定區間長度)

Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 46507 Accepted: 13442 Case Time Limit: 5000MS Description