BZOJ3333 排隊計畫(樹狀陣列 線段樹)

2022-05-14 13:54:11 字數 1207 閱讀 6630

點此看題面

大致題意:給定乙個序列\(a_i\),每次把\(i\sim n\)中小於等於\(a_i\)的數排序並放回原位置,求所有操作前及每一操作後的逆序對個數。

眾所周知,排序的題目中必然有許多有趣的性質。

我們定義乙個數的貢獻為它為較大值的逆序對個數

可以發現,根據此題的排序方式,不被排序的數與被排序的數之間的相對大小是不變的,也就是說,不被排序的數的貢獻不會被改變。

而所有被排序的數,由於小於它的數必然都到了它的前面,因此貢獻相當於被清零了。

求初始貢獻可以直接用樹狀陣列,然後我們還需要乙個資料結構,能實現對一段區間內小於等於某數的數進行修改。

乍一看,兩重限制,似乎是樹套樹?

實際上, 由於每次修改是清零,因此每個數隻需被修改一次即可。

那麼,如果我們每次清零時同時給這個位置上的高度賦乙個極大值,就能夠保證每個位置只被修改一次。

於是,只要用線段樹就能維護了。

#include#define tp template#define ts template#define reg register

#define ri reg int

#define con const

#define ci con int&

#define i inline

#define w while

#define n 500000

#define ll long long

using namespace std;

int n,a[n+5],s[n+5],dc,dv[n+5];

class fastio

tp i void read(ty& x)

tp i void writeln(ty x)

i void clear()

}f;class segmenttree//線段樹

o[n<<2];

public:

i void build(pt)//建樹

i void u(ci s,ci x,pt)//修改

i ll q() //詢問整個序列和

}s;struct treearray//樹狀陣列

//修改

i int q(ri x,ri t=0) //詢問

}t;int main()

bzoj3333 排隊計畫 (線段樹)

time limit 20 sec memory limit 128 mb submit 717 solved 323 submit status discuss 6 2160 163 164 161 167 160 2 3 63 1 題目思路 每次操作是把乙個數後面所有小於等於該數值的位置都排序重...

BZOJ2141 排隊 分塊,樹狀陣列

排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家 樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍 高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為 滿足ihj的 i,...

BZOJ2141 排隊 樹狀陣列 分塊

給定乙個序列 a 先輸出原先的逆序對數。然後 m 次操作,每次交換兩個數,並輸出交換後的逆序對數。1 m 2 times 10 3,1 n 2 times 10 4,1 a i 10 9 離散化。分個塊。對於每乙個字首塊和字尾塊搞乙個樹狀陣列,維護一下每種值的個數的字首和。考慮刪除和增加操作,就是修...