樹狀陣列維護區間最值

2021-10-03 05:39:36 字數 1278 閱讀 2392

題目描述

給你乙個1->n的排列和乙個棧,入棧順序給定

你要在不打亂入棧順序的情況下,對陣列進行從大到小排序

當無法完全排序時,請輸出字典序最大的出棧序列

輸入描述:

第一行乙個數n

第二行n個數,表示入棧的順序,用空格隔開,結尾無空格

輸出描述:

輸出一行n個數表示答案,用空格隔開,結尾無空格

示例1輸入複製5

2 1 5 3 4

輸出複製

5 4 3 1 2

說明2入棧;1入棧;5入棧;5出棧;3入棧;4入棧;4出棧;3出棧;1出棧;2出棧

思路簡單就是找到區間的最大值,直接輸出,剩下的入棧即可。

#include

#include

using namespace std;

const

int maxn =

1e6+5;

int n, cnt =0;

int a[maxn]

, c[maxn *4]

, sta[maxn]

;//棧和樹狀陣列以及棧

intlowbit

(int x)

//獲得某個區間的最大值

intquery

(int l,

int r)

ans=

max(ans,a[r]);

}return ans;

}//將x位置修改為p

void

update

(int x,

int p)

x +=lowbit

(x);}}

void

test()

;for

(int i =

1; i <=

9; i++

)printf

("%d %d %d"

,query(1

,9),

query(5

,5),

query(6

,9))

;}intmain()

int maxv = n;

for(

int i =

1; i <= n; i++

)else

}//出棧

for(

--cnt; cnt >

0;cnt--

)printf

("%d\n"

, sta[0]

);return0;

}

樹狀陣列之區間最值

數學原理 利用上面的性質,在樹狀陣列的尾部插入資料,來建立乙個樹狀陣列 void push int pos void update int pos,int v int pre c pos pos lowbit pos 父親的位置 更新父親 while pos n 沒有更新父親 else break ...

樹狀陣列求區間最值

樹狀陣列 binary index tree 利用二進位制的一些性質巧妙的劃分區間,是一種程式設計,時間和空間上都十分理想的求區間和的演算法,同樣我們可以利用樹狀陣列優美的區間劃分方法來求乙個序列的最值 約定以 num 表示原陣列,以 idx 表示索引陣列,lowbit x x x 樹狀陣列求和時通...

樹狀陣列求區間最值

樹狀陣列 binary index tree 利用二進位制的一些性質巧妙的劃分區間,是一種程式設計,時間和空間上都十分理想的求區間和的演算法,同樣我們可以利用樹狀陣列優美的區間劃分方法來求乙個序列的最值 約定以 num 表示原陣列,以 idx 表示索引陣列,lowbit x x x 樹狀陣列求和時通...