題面
第一道自己腦補出來的整體二分,這樣我就不用去打那個樹樁陣列套主席樹了
開心主要是把各個操作分開
op==1 則為加操作
op==2 則為減操作
op==3則為區間查詢操作
之後直接將詢問的次數和值域二分求解即可
#include#define lowbit(x) x&(-x)using
namespace
std;
const
int n=1e5+7
;const
int inf=1e9+7
;int
m,n,t;
intans[n],num[n];
struct
node
q[n],q1[n],q2[n];
struct
tree
int query(int
x)
} g;
intcur[n];
void solve(int
from,int to,int l,int
r)
int mid=(l+r)>>1
;
for (int i=from;i<=to;i++)
if (q[i].op==3) cur[i]=g.query(q[i].y)-g.query(q[i].x-1
); }
for (int i=from;i<=to;i++)
if (q[i].k<=mid)
int t1=0,t2=0
;
for (int i=from;i<=to;i++)
if (q[i].op==1||q[i].op==2
)
else
for (int i=0;ifrom+i]=q1[i];
for (int i=0;ifrom+t1+i]=q2[i];
solve(
from,from+t1-1
,l,mid);
solve(
from+t1,to,mid+1
,r);
}int
main()
int tot=0
;
for (int i=1;i<=m;i++)
if (s[0]=='c'
)
}solve(
1,n,0
,inf);
for (int i=1;i<=tot;i++)
printf(
"%d\n
",ans[i]);
}return0;
}
整體二分專題
何謂整體二分?一般的二分只適用於單個詢問的,如果有很多個詢問,就變成了n 2n 2 n2或更高但整體二分則可以迅速處理多個詢問的問題 首先需要離線,讀入所有詢問 然後我們二分答案,這時候我們將詢問分成兩個部分,如果l r就直接更新答案,否則考慮分治,詢問的答案在左邊的丟到左邊,答案在右邊的則丟到右邊...
學習 整體二分
在?看看整體二分 整體二分是個啥,就是遞迴進行二分答案的操作,按照當前二分出的區間對詢問操作和修改操作進行左右分類。有點類似於歸併排序的樣子,但是需要用個維護區間的資料結構來維護當前詢問區間的區間的查詢和修改操作,每次查詢完當前區間的操作之後,需要清空之前的修改操作。整體二分可以保證會互相影響的操作...
整體二分總結
通常與 cdq 分治同類談論,處理的問題性質本質上有不同 整體二分,顯然整體 同時 處理多個二分查詢,通常帶有修改,我們需要分治處理 solve l,r,l,r 為操作 l,r 中答案均在 l,r 區間內 我們是分治處理 l,mid 操作的前 n 個為新增操作 靜態陣列 掃一遍操作,新增操作時把 v...