Codechef MONSTER 整體二分 分塊

2021-08-26 15:16:28 字數 1188 閱讀 8786

有n個敵人,編號為0到n-1,每個敵人都有乙個血量h。現在有q次操作,每次給出兩個數x和y,表示將所有編號為x的子集(二進位制下)的敵人血量都減去y。要求每次操作後輸出還剩下多少個敵人的血量大於0。 n≤

217,m

≤218,

h,y≤

109n ≤2

17,m≤

218,h

,y≤10

9已經頹廢到開始寫題了。

首先可以整體二分(或者分塊),然後就變成了子集加和單點查詢問題,很容易想到分成前面9位和後面9位來做,這樣複雜度就是o(

nn−−

√log

n)o (n

nlog

n)

,然後極限爆過去了。

#include

#include

#include

#include

#include

typedef

long

long ll;

const

int n=500005;

const

int par1=(1

<<9)-1;

const

int par2=(1

<<18)-1-par1;

int n,m,t[n],a[n],b[n],bin[20],ans[n],die[n],tmp[n];

ll h[n],w[n];

int read()

while (ch>='0'&&ch<='9')

return x*f;

}void add(int x,ll y)

ll query(int x)

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

int mid=(l+r)/2;

for (int i=l;i<=mid;i++) add(a[i],b[i]);

int p=l,q=r;

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

for (int i=l;i<=r;i++) t[i]=tmp[i];

for (int i=l;i<=mid;i++) add(a[i],-b[i]);

solve(l,mid,l,p-1);solve(mid+1,r,q+1,r);

}int main()

二分 分蛋糕問題

題意 n種蛋糕,每個半徑給出,要分給f 1個人,要求每個人分的體積一樣 形狀可以不一樣 而且每人只能分得一種蛋糕 不能多種蛋糕拼在一起 求每人最大可以分到的體積。輸入 3 3 34 3 3 1 24 510 5 1 4 2 3 4 5 6 5 4 2 輸出 25.1327 3.1416 50.265...

整體二分專題

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

學習 整體二分

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