樹狀陣列 Jzoj P3462 休息

2022-09-18 00:57:14 字數 1407 閱讀 1676

description

休息的時候,可以放鬆放鬆渾身的肌肉,打掃打掃衛生,感覺很舒服。在某一天,某lmz 開始整理他那書架。已知他的書有n 本,從左到右按順序排列。他想把書從矮到高排好序,而每一本書都有乙個獨一無二的高度hi。他排序的方法是:每一次將所有的書劃分為盡量少的連續部分,使得每一部分的書的高度都是單調下降,然後將其中所有不少於2 本書的區間全部翻轉。重複執行以上操作,最後使得書的高度全部單調上公升。可是畢竟是休息時間,lmz 不想花太多時間在給書排序這種事上面。因此他劃分並翻轉完第一次書之後,他想計算,他一共執行了多少次翻轉操作才能把所有的書排好序。lmz 驚奇地發現,第一次排序之前,他第一次劃分出來的所有區間的長度都是偶數。

input

第一行乙個正整數n, 為書的總數。

接下來一行n個數,第i個正整數hi,為第i 本書的高度。

output

僅乙個整數,為lmz 需要做的翻轉操作的次數。

sample input

6

5 3 2 1 6 4

sample output

3

【樣例解釋】

第一次劃分之後,翻轉(5,3,2,1),(6,4)。之後,書的高度為1 2 3 5 4 6,然後便是翻轉(5,4)即可。

data constraint

對於10%的資料:n<=50

對於40%的資料:n<=3000

對於100%的資料:1<=n<=100000, 1<=hi<=n

1 #include 2 #include 3 #include 4

using

namespace

std;

5const

long

long inf=1000000000;6

long

long n,a[100010],mx,l,sum[100010];7

long

long

ans;

8long

long getsum(long

longx)9

16return

num;17}

18void update(long

long

x)1925}

26void swap(long

long l,long

long

r)27

32int

main()

3347}48

else mx=a[i];49}

50if (l;

51for (long

long i=n;i>=1;i--)

5256 printf("

%lld

",ans);

57return0;

58 }

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...

樹狀陣列 瞎bb 樹狀陣列

樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...

樹狀陣列 二維樹狀陣列模板

樹狀陣列模板 int lowbit int x int add int x,int val int que int x 模板題 題解 include include include using namespace std int c 300000 rank 300000 int n int lowb...