整體二分(部分)

2021-09-28 17:05:25 字數 1059 閱讀 7620

首先確定乙個決策區間solve(l, r, l, r)表示編號在lr的操作的數的權值和詢問的答案在lr這個區間,每次將答案二分,把lr裡的修改操作按被修改數的權值<=mid和》mid分成左右兩邊,如果<=mid,就把它下標所在位置在bit裡+1,把lr裡的查詢操作按bit上查詢區間裡的sum>=k和#include#include#include#includeusing namespace std;

const int maxn=500010, inf=1e9;

struct poiq[maxn], q1[maxn], q2[maxn];

int n, m, x, y, k, cnt, cnt1, cnt2;

int tree[maxn], ans[maxn], a[maxn];

inline void read(int &k)

inline void add(int x, int delta)

inline int query(int x)

void solve(int l, int r, int l, int r)

int mid=(l+r)>>1, cnt1=0, cnt2=0;

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

if(q[i].ty)

else

for(int i=1;i<=cnt1;i++) if(!q1[i].ty) add(q1[i].pos, -q1[i].y);

for(int i=1;i<=cnt1;i++) q[l+i-1]=q1[i];

for(int i=1;i<=cnt2;i++) q[l+cnt1+i-1]=q2[i];

solve(l, mid, l, l+cnt1-1); solve(mid+1, r, l+cnt1, r);

}int main()

; for(int i=1;i<=m;i++) read(x), read(y), read(k), q[++cnt]=(poi);

solve(-inf, inf, 1, cnt);

for(int i=1;i<=m;i++) printf("%d\n", ans[i]);

}

整體二分專題

何謂整體二分?一般的二分只適用於單個詢問的,如果有很多個詢問,就變成了n 2n 2 n2或更高但整體二分則可以迅速處理多個詢問的問題 首先需要離線,讀入所有詢問 然後我們二分答案,這時候我們將詢問分成兩個部分,如果l r就直接更新答案,否則考慮分治,詢問的答案在左邊的丟到左邊,答案在右邊的則丟到右邊...

學習 整體二分

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

整體二分總結

通常與 cdq 分治同類談論,處理的問題性質本質上有不同 整體二分,顯然整體 同時 處理多個二分查詢,通常帶有修改,我們需要分治處理 solve l,r,l,r 為操作 l,r 中答案均在 l,r 區間內 我們是分治處理 l,mid 操作的前 n 個為新增操作 靜態陣列 掃一遍操作,新增操作時把 v...