二分+三分講解
二分是一種很強的方法,不要因為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的長度十分大時,這種方法就不好用了。二分橫...
二分和三分
二分 二分,即為折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。也就是說,二分的條件為必須滿足數列或某一邏輯的順序性,單調 只有這樣才能進行二分。查詢方法 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如...