Foreign 資料結構C 線段樹

2022-05-20 06:58:26 字數 2743 閱讀 8879

首先,d操作為刪除操作顯然不可做,又發現這道題可以離線處理,那麼我們考慮倒著來,維護加入操作。

那麼這時候,d操作就變為了合併操作,那麼這時候我們只需要維護乙個:可以支援單點修改查詢第 k 大資訊可合併的資料結構即可。

顯然構建若干棵權值線段樹即可!對於每個聯通塊維護一棵線段樹,用並查集判斷兩點是否在乙個塊內。

這時候,d操作顯然判斷一下兩點是否在乙個聯通塊內,不在則合併兩棵線段樹;q操作就是查詢第 k 大,在樹上二分即可;c操作就是原來值個數-1新加入值個數+1

就簡單地解決了這題啦!(本質上就是bzoj1926弱化 + bzoj1015 qwq)

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;89

const

int one = 1000005;10

const

int inf =2e6;

11const

int base =1e6;

1213

intn, m;

14int

opt, x, val;

15int val[100005

];16

char s[5

];17

18int ans[300005], ans_num = 0;19

20int fat[100005

];21

22int num = 0, del[100005

];23

struct power oper[one];

24struct point a[100005

];25

int total = 0;26

struct

seg27

node[one * 4

];32

33int

get()

3443

44int find(int

x)45

4950

void un(int x, int

y)51

5556

void update(int &i, int l, int r, int val, int opt) //

pos = val , + opt

5769

70int merge(int y, int x) //

y merge to x

7180

81int query(int i, int l, int r, int k) //

k da

8291

92void

deal_first()

93101

102void deal_add(int x, int

y)103

109110

void deal_query(int root, int

k)111

114 ans[++ans_num] = query(node[root].root, 0

, inf, k);

115}

116117

void deal_change(int x, int y) //

x is point, y is need val

118124

125int

main()

126;

138if(s[0] == 'q'

)139 x = get(), val = get(), oper[++num] = (power);

140if(s[0] == 'c'

)141 x = get(), val = get(), oper[++num] = (power), val[x] = val +base;

142}

143144

deal_first();

145for(int i = num; i >= 1; i--)

146151

152for(int i = ans_num; i >= 1; i--)

153 printf("

%d\n

", ans[i] -base);

154 }

view code

Foreign 染色 LCT 線段樹

詢問x到根路徑上不同顏色的個數,支援將x到根的路徑上的點全部設為新的顏色。我們將邊兩端的點顏色相同的邊設為實邊,不同的設為虛邊。那麼一次新增顏色的操作顯然就是lct的access操作!access的時候恰是虛邊和實邊的轉換。那麼我們只要用線段樹維護每個點到根的貢獻,結合dfs序來實現子樹加,每次在l...

C 線段樹 高階資料結構

線段樹是一種平衡二叉搜尋樹 完全二叉樹 它將乙個線段區間劃分成一些單元區間。對於線段樹中的每乙個非葉子節點 a,b 他的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 最後的葉子節點數目為n,與陣列下標對應。線段樹的一般包括建立 查詢 插入 更新等操作,建立規模為n的時間...

資料結構 線段樹

啦啦啦啦啦啦線段樹是個好東西 好吧並沒有什麼好的 但貌似還是很好啊 線段樹就是一棵樹!顧名思義 又是這個詞 就是求關於一段的某些什麼什麼東西。比如區間最大值啊什麼的。引用百科知識 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中...