POJ2823 線段樹求區間的最值

2021-05-27 15:17:43 字數 801 閱讀 7083

本來想搞單調佇列的....結果網上搜單調隊你列的題...一搜搜到這道...一看...果斷敲線段樹..還沒寫過線段樹求最值的....在求和上稍微修改下就可以了...而且這個題目沒有修改的...所以一開始建好樹後...不需要updata...只要尋找答案就可以了...這個程式的主心部分就是如何用線段樹求最值...

首先來看初始化的問題....既然我們要求一段區間的最大值和最小值...那就在初始化時構造兩棵樹好了...一顆treemin存最小值...一顆treemax存最大值...treemin的非葉子節點是其左孩子和右孩子中較小的...treemax的非葉子節點是其左孩子和右孩子中較大的..

void build(int l,int r,int sp)

int mid=(l+r)/2;

build(l,mid,sp*2);

build(mid+1,r,sp*2+1);

treemin[sp]=treemin[sp*2]treemax[sp*2+1]?treemax[sp*2]:treemax[sp*2+1];

}

求和過程..getmin和getmax除了乙個是ans>***x乙個是ans

int getmin(int l,int r,int l,int r,int sp)

{ if (l<=l && r>=r) return treemin[sp];

int mid=(l+r)/2,temp,ans=oo;

if (mid>=l)

{temp=getmin(l,r,l,mid,sp*2);

ans=ans

poj 2823 滑動視窗 單調佇列 線段樹

題意 求滑動視窗中的最大值和最小值。分析 可以用線段樹來做,建完樹後,查詢區間n k 1次就行,每次查詢o 1 時間複雜度o n 也可以用單調佇列來做,比如求視窗中的最小值,那麼就維護乙個遞增的佇列,那麼最小元素就是隊首元素,每次右移,只要維護佇列元素是遞增的就可以。同樣,求最大值,是維護乙個遞減的...

poj 2823 參考的優先佇列

poj 2823 感覺沒什麼大區別,怎麼就re呢?include include includeusing namespace std int a 1000011 陣列資料 int outmin 1000011 最小值 int outmax 1000011 最大值 int cnt1 0 int cn...

滑動視窗(poj,線段樹維護區間最值)

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...