點此看題面
大致題意:給定乙個序列\(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 離散化。分個塊。對於每乙個字首塊和字尾塊搞乙個樹狀陣列,維護一下每種值的個數的字首和。考慮刪除和增加操作,就是修...