輸出一行乙個整數,表示 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 #includeview code3 #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 }
Foreign 染色 LCT 線段樹
詢問x到根路徑上不同顏色的個數,支援將x到根的路徑上的點全部設為新的顏色。我們將邊兩端的點顏色相同的邊設為實邊,不同的設為虛邊。那麼一次新增顏色的操作顯然就是lct的access操作!access的時候恰是虛邊和實邊的轉換。那麼我們只要用線段樹維護每個點到根的貢獻,結合dfs序來實現子樹加,每次在l...
主席樹 初學
現在才開始學主席樹 弱 不過不帶修改的話 還是很簡單的嘛。或者說應該叫可持久化線段樹?首先對數的區間進行離散化,這樣下面的a i 都預設為離散化以後的結果了。對於每個1.i開乙個線段樹,對於這個線段樹中的每乙個節點 l,r 表示1.i中在 l,r 中的數的個數。顯然這n個線段樹的形態大小是完全一樣的...
主席樹 模板
思想 主席樹就是一顆持久化線段樹,為什麼叫持久化了,因為它可以儲存之前的線段樹版本,並且可以拿來用,從而優化空間.至於為什麼叫主席樹了,大概是因為發明這個演算法的人的名字的緣故吧 詳細說說 主席樹是一種離線資料結構,是由很多棵線段樹組成的。第i棵線段樹存的是前i個數的資訊 每乙個線段存數字的出現次數...