Foreign 畫方框 主席樹

2022-05-20 06:58:27 字數 3225 閱讀 2013

輸出一行乙個整數,表示 cd 最多可能畫了幾個方框。

給定乙個01矩陣,1表示有標記,詢問正方形方框的個數。

首先,我們先從維護對角線上的點這一層面來考慮。

我們先把乙個點能向左向上拓展的最大長度以及能向右向下的最長長度預處理出來。

那麼這時候,我們考慮對於一條對角線上的點怎麼在o(nlogn)以內統計出答案。必然要用到某些資料結構

舉個例子,比如這個資料:

1 1 1 1

1 0 0 0

1 0 0 1

1 0 1 1

我們現在統計中間對角線的答案。

現在查詢第乙個點(1,1),他向右向下拓展長度為 4 。

就是查詢,後面三個點中 可以向左上拓展的長度 (2,2)>=1 (3,3)>=2 (4,4)>=3,

這三個條件滿足了幾個。

這樣的話,我們發現:每次統計乙個點的時候查詢的就是:在這個點 可以向右向下拓展 到的範圍內,它後面的第 i 個點可以向左向上拓展長度是否 > i。

我們發現:查詢後面若干個數的值是否 > 乙個等差數列比較複雜。

於是乎,若統計第id個的答案,後面第num個點(在向右向下範圍內)可以被統計所需要滿足的條件是:num - id + 1 <= val也就是num - val + 1 <= id。(其中val表示這個點可以向左向上拓展的長度

所以我們如果把i - val + 1加入到乙個資料結構中的話,

查詢的就是:某一範圍內 <=乙個定值 的數的個數

那直接用主席樹來做就好了。

這樣我們就解決了這個問題 qwq。

1 #include2 #include    

3 #include4 #include5 #include6 #include7 #include8 #include9

using

namespace

std;

10 typedef long

long

s64;

1112

const

int one = 1005;13

const

int inf = 10001;14

15int

n;16

inta[one][one];

17int

ans;

1819

struct

power

20a[one][one];

2526

intcnt, res;

27struct

point

28node[one * 19

];33

34int

get()

3544

45void

deal_first()

4656

57for(int j = 1; j <= n; j++)

5866

67for(int i = 1; i <= n; i++)

68for(int j = 1; j <= n; j++)

69 a[i][j].l =min(a[i][j].left, a[i][j].up),

70 a[i][j].r =min(a[i][j].right, a[i][j].down);71}

7273

void update(int &x, int y, int l, int r, int q, int

val)

7487

88void query(int x, int y, int l, int r, int l, int

r)89

9596

int mid = l + r >> 1;97

98if(l <=mid) query(node[x].left, node[y].left, l, mid, l, r);

99if(mid + 1

<=r) query(node[x].right, node[y].right, mid + 1

, r, l, r);

100}

101102

103int

main()

104124

125 cnt = 0

;126

for(int i = 1; i <= cnt; i++)

127 node[i].left = node[i].right = node[i].root = node[i].value = 0

; 128

}129

130for(int id = 2; id <= n; id++)

131142

143 cnt = 0

;144

for(int i = 1; i <= cnt; i++)

145 node[i].left = node[i].right = node[i].root = node[i].value = 0

; 146

}147

148 printf("%d"

, ans);

149 }

view code

Foreign 染色 LCT 線段樹

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

主席樹 初學

現在才開始學主席樹 弱 不過不帶修改的話 還是很簡單的嘛。或者說應該叫可持久化線段樹?首先對數的區間進行離散化,這樣下面的a i 都預設為離散化以後的結果了。對於每個1.i開乙個線段樹,對於這個線段樹中的每乙個節點 l,r 表示1.i中在 l,r 中的數的個數。顯然這n個線段樹的形態大小是完全一樣的...

主席樹 模板

思想 主席樹就是一顆持久化線段樹,為什麼叫持久化了,因為它可以儲存之前的線段樹版本,並且可以拿來用,從而優化空間.至於為什麼叫主席樹了,大概是因為發明這個演算法的人的名字的緣故吧 詳細說說 主席樹是一種離線資料結構,是由很多棵線段樹組成的。第i棵線段樹存的是前i個數的資訊 每乙個線段存數字的出現次數...