二分 三分 莫隊全紀錄

2021-08-18 02:50:59 字數 2774 閱讀 7012

二分+三分講解

二分是一種很強的方法,不要因為ta太普遍而忽視

這裡指出ta的必要條件:

也就是說,如果我們發現乙個問題不好直接求解,但是我們可以想辦法判定乙個解得正確性,那麼就可以考慮二分

三分實際上就是凸函式上的「二分」

一般用於凸包,二次函式等的最值求解

可能有些題目的凸性不那麼明顯,那麼我們就可以手玩一下,進行簡單的判斷

經典例題:二分+並查集

經典例題:三分+秦九韶演算法

經典例題:線段樹分治+凸包+三分

經典例題:分塊+凸包+三分

**變化比較多,只能給出一些比較典型的

//二分最大值 

int ef(int l,int r)

return ans;

} //二分最大值(double)

const

double eps=1e-8;

double ef(double l,double r)

return (l+r)/2.0;

}//三分上凸函式

int sf(int l,int r)

return f(l)>f(r)? l:r;

} int sf(int l,int r)

m1=l+(r-l)/3;

m2=r-(r-l)/3;

if (f(m1)else r=m2;

}}//三分上凸函式(double)

double sf(double l,double r)

return (m1+m2)/2.0;

}

莫隊講解

帶修改的樹上莫隊

經典例題:序列上的莫隊

經典例題:帶修改的莫隊

經典例題:不帶修改的樹上莫隊

莫隊簡直就是暴力的王者,優異而且簡單易學

可能有乙個小缺點:一般需要乙個巨大的陣列記錄類似顏色數之類的東西注意

莫隊的分塊

int cmp(const node &a,const node &b) 

q[i].block=(q[i].x-1)/unit+1

;

樹上莫隊

樹上路徑的莫隊實際上就是搞出乙個df

s dfs

序 根據路徑(u

,v) (u,

v)

的形態不同,詢問不同的區間:

如果乙個結點掃了奇數次,那麼我們加入ta的貢獻

如果乙個結點掃了偶數次,那麼我們減去ta的貢獻

如果我們強行加上修改,就像可修改的序列莫隊那樣搞就好了

struct nodeq[n];

int dfn[n],vis[n],cnt[n],tot=0,ans[n];

void update(int

x) else

vis[x]^=1;

}void solve()

}

可修改的莫隊

對於可修改的序列莫隊,本質上就像整體二分中記錄乙個修改指標

細節一注意我們要先移動區間端點,再移動修改指標

這樣能防止重複計算,並且保證我們的cn

t cnt

陣列中記錄的一定是[l

,r] [l,

r]

的影響在處理乙個詢問之前,暴力將指標移動到「能影響這個詢問的修改都處理過了」的這麼乙個位置

在處理修改操作的時候,我們只有這個操作會影響該區間時才進行up

dateup

date

但是不敢怎麼樣我們都要sw

aps wa

p(之所以是sw

aps wa

p,是為了我們修改完還要保證能夠恢復

帶修改莫隊

#include

#include

#include

#include

#include

using namespace std;

const int n=1000010;

int n,m,cnt[n],cnt_a=0,cnt_q=0,ans[n];

int c[n],tot=0;

struct nodeq[n];

//x,y 區間左右端點

//block 分塊

//num 在當前詢問之前有多少個修改 s

struct pointa[n];

int cmp(const node &a,const node &b)

void update(int

x,int z)

else

}void change(int bh,int z,int l,int r)

void solve()

}int main()

else

}sort(q+1,q+1+cnt_q,cmp);

solve();

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

}

二分 三分模板

適用於 單調函式 單調增或單調減 基本思想 給定9個數,由小到大排列,從這9個數中找出某乙個確切的數 比如4 偽 int binary sreach int a,int left,int right,int x if a left x return left return 1 給你三個陣列a,b,c...

二分和三分

三分二分,乙個簡單而神奇的演算法,可以簡化時間複雜度,但是用二分有乙個條件,就是我們進行二分的序列必須有單調性。原理 aa中找乙個數x xx 保證x xx一定存在 我們可以用樸素演算法,直接從頭到尾找一遍,時間複雜度o n o n o n 如果當序列a aa的長度十分大時,這種方法就不好用了。二分橫...

二分和三分

二分 二分,即為折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。也就是說,二分的條件為必須滿足數列或某一邏輯的順序性,單調 只有這樣才能進行二分。查詢方法 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如...