alpha 分治NTT 線段樹

2021-09-02 23:53:37 字數 2787 閱讀 7687

題目大意:

有[1,1e9]的數軸,n次操作每次給乙個區間[li,ri]的數有pi的概率+1,1-pi的概率不變。問最後等於k的數字期望有多少個。n≤5

×104

n\le5\times10^4

n≤5×10

4題解:

問題等價於區間乘以乙個一次式,最後對每個位置求k次項係數。

離散化後線段樹,等價於每次從根到葉節點的式子乘起來在乘個葉節點對應的區間長度取k次項係數求和。但這麼做複雜度是錯的,考慮反過來從下到上合併,每個節點的初始資訊用分治ntt算一下即可,這樣複雜度顯然不會超過三個log。

#include

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define rep(i,v) rep(i,0,(int)v.size()-1)

#define lint long long

#define p 998244353

#define ull unsigned lint

#define db long double

#define pb push_back

#define mp make_pair

#define fir first

#define sec second

#define gc getchar()

#define debug(x) cerr<<#x<<"="<#define sp <<" "

#define ln typedef pair<

int,

int> pii;

typedef set<

int>

::iterator sit;

inline

intinn()

vector<

int> vec;

inline

intgetid

(int x)

inline

intclrv

(vector<

int>

&v)inline

intfast_pow

(int x,

int k,

int ans=1)

inline

intshow

(const vector<

int>

&a)namespace ntt_space

inline

intntt

(int

*a,int n,

int s)

if(s<0)

for(

int i=

0,ninv=

fast_pow

(n,p-2)

;i) a[i]

=(lint)a[i]

*ninv%p;

return0;

}inline vector<

int>

pls(

const vector<

int>

&a,const vector<

int>

&b)inline vector<

int>

tms(

const vector<

int>

&a,const vector<

int>

&b)inline vector<

int>

solve

(vector<

int>

&pv,

int l,

int r)

int mid=

(l+r)

>>1;

return

tms(

solve

(pv,l,mid)

,solve

(pv,mid+

1,r));

}}using ntt_space:

:pls;

using ntt_space:

:tms;

using ntt_space:

:solve;

struct segment

*rt;

intbuild

(segment*

&rt,

int l,

int r)

intupdate

(segment*

&rt,

int l,

int r,

int s,

int t,

int v)

intdfs

(segment*

&rt,

int l,

int r)

int mid=

(l+r)

>>1;

dfs(rt->ch[0]

,l,mid)

,dfs

(rt->ch[1]

,mid+

1,r)

; rt->pl=

tms(rt->pl,

pls(rt->ch[0]

->pl,rt->ch[1]

->pl));

return

clrv

(rt->ch[0]

->pl)

,clrv

(rt->ch[1]

->pl),0

;}const

int n=

50010

;int l[n]

,r[n]

,pv[n]

;int

main()

線段樹分治

動態圖聯通性 可離線 loj121 給你一張無向圖,你要支援如下操作 1 刪除一條邊 2 加入一條邊 3 查詢某兩個點對間是否聯通 離線做法 線段樹分治 口胡做法 把操作的順序當做時間。每條邊維護乙個存活區間,代表這條邊在這個時間區間裡面活著。對時間軸建立一顆線段樹,從線段樹根開始dfs。進入乙個子...

線段樹分治

首先,這裡的線段樹是狹義的線段樹。而線段樹分治是一種維護時間區間的資料結構,利用線段樹的分治性使時間複雜度為log loglo g級別。維護時間區間的資料結構有cdq分治 kd tree,那麼線段樹分治和它們的區別在 呢?其實,它就是用回退操作來實現可持久化,或者說是維護了操作會影響的時間區間。我們...

線段樹分治

day2模擬被完爆了w 來學一波線段樹分治 原來一直拿它口胡其實沒寫過。然鵝這個東西和線段樹的關係 就像點分治和點分樹一樣 並不用建出來 但遍歷順序是一致的 從上到下 從左兒子到右兒子 訪問 線段樹 的所有節點 每個節點表示乙個區間 當然維護的也是區間裡的值 這就要求我們維護的東西滿足區間加法 比如...