學習筆記 整體二分(BZOJ2738矩陣乘法)

2021-09-05 11:46:23 字數 1410 閱讀 8077

也是因為一道題才來學的。。。

然後就發現這道模板貌似是暑假初期在某校集訓的時候的比賽題 並且好像沒改= =

前置芝士

1.二分= =

* cdq分治[你要是知道cdq分治的話這玩意就很好理解啦]

*本題使用二維樹狀陣列

整體二分是類似cdq分治的一類東西

cdq分治是計算左邊對右邊的貢獻

整體二分是計算左邊的貢獻來確定答案在哪邊

具體來說就是這樣乙個過程

[l,r,l,r] : 小寫代表答案區間 大寫表示詢問區間

我們通過計算 l 到 mid 的答案 來確定[l,r]的詢問的答案是屬於[l,mid]還是[mid,r]

對於這個題就是把<=mid的值計算貢獻 然後對於這些詢問看是否》=k 這樣就可以同時二分答案和詢問從而做到均攤nlgn

**實現並不複雜。 注意權值和詢問別放反了= =

附**。

#include#include#include#include#define inf 20021225

#define ll long long

#define lowbit(x) (x&(-x))

#define mxn 60010

using namespace std;

struct nodet[250010];

struct queryq[mxn];

int f[510][510],n,ans[mxn],id[mxn];

int cur[mxn],cr[mxn],m,cnt=0;

int val[250010];

void modify(int x,int y,int v)

int query(int x,int y)

int get(int x1,int x2,int y1,int y2)

int now;

void work(int l,int r,int l,int r)// [l,r] val [l,r] query

int mid = l+r>>1;

while(nowmid) modify(t[now].x,t[now].y,-1),now--;

int l1=0,l2=0,mid;

for(int i=l;i<=r;i++)

mid = l+l1-1;

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

id[l+i-1]=cur[i];

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

id[mid+i]=cr[i];

work(l,mid,l,mid); work(mid+1,r,mid+1,r);

}bool cmp(node a,node b)

int main()

整體二分 學習筆記

作者會把自己學習時遇到的一些疑問回答,盡量寫的詳細 合理,讓更多人能夠理解這個演算法。顧名思義,整體二分是處理這樣一種問題 可以使用二分法解決,但是對於每乙個詢問都進行一次二分時間複雜度無法接受的問題。這時候,整體二分就誕生了 它先將所有操作讀入,然後進行乙個統一的二分,或者說 分治。因為是一次性處...

學習 整體二分

在?看看整體二分 整體二分是個啥,就是遞迴進行二分答案的操作,按照當前二分出的區間對詢問操作和修改操作進行左右分類。有點類似於歸併排序的樣子,但是需要用個維護區間的資料結構來維護當前詢問區間的區間的查詢和修改操作,每次查詢完當前區間的操作之後,需要清空之前的修改操作。整體二分可以保證會互相影響的操作...

學習筆記 整體二分(BZOJ2738矩陣乘法)

也是因為一道題才來學的。然後就發現這道模板貌似是暑假初期在某校集訓的時候的比賽題 並且好像沒改 前置芝士 1.二分 cdq分治 你要是知道cdq分治的話這玩意就很好理解啦 本題使用二維樹狀陣列 整體二分是類似cdq分治的一類東西 cdq分治是計算左邊對右邊的貢獻 整體二分是計算左邊的貢獻來確定答案在...