校內模擬 長鏈剖分 線段樹 看門人

2021-09-27 01:52:22 字數 2724 閱讀 7424

題意:求一棵樹上每個點的子樹中經過這個點的所有路徑中邊數在給定範圍內的最長路徑

早上8:05開考,8:10分看完題就秒了

然而有個地方沒有開longlong

而且線段樹維護長鏈的方向反了

所以連部分分都沒了

裸的長鏈剖分,需要用線段樹維護區間最大值,最好是zkw線段樹(偷懶不想寫)

code:

#include

#define mod 998244353

#define ll long long

#define pb push_back

#define mp make_pair

#define db double

#define ri register

#define fi first

#define se second

using

namespace std;

inline

intread()

while

(isdigit

(ch)

)return res*f;

}const

int n=

1e6+

5,bs=

23333

;inline

void

inc(

int&x,

int y)

inline

void

mul(

int&x,

int y)

inline

intmul

(int x,

int y)

namespace segtreetr[n<<2]

;#define ls tr[k].l

#define rs tr[k].r

#define mid (ls+rs>>1)

inline

void

pushup

(int k)

inline

void

pushadd

(int k,ll v)

inline

void

pushdown

(int k)

}void

build

(int k,

int l,

int r)

void

modify

(int k,

int pos,ll x)

pushdown

(k);

if(pos<=mid)

modify

(k<<

1,pos,x)

;else

modify

(k<<1|

1,pos,x)

;pushup

(k);

}void

modify_seq

(int k,

int ql,

int qr,ll v)

ll query

(int k,

int ql,

int qr)

}using

namespace segtree;

int lson[n]

,mxdep[n]

,dep[n]

,len[n]

;int vis[n<<1]

,head[n]

,nxt[n<<1]

,c[n<<1]

,tot=0;

inline

void

add(

int x,

int y,

int z)

void

dfs1

(int v)

len[v]

=mxdep[v]

-dep[v];}

int dfn[n]

,sign=0;

void

dfs2

(int v)

ll ans[n]

;int l[n]

,r[n]

;voiddp(

int v)

for(

int j=

0;j<=len[y]

;j++)}

if(len[v]

>=l[v]

) ans[v]

=max

(ans[v]

,query(1

,dfn[v]

+l[v]

,dfn[v]

+min

(len[v]

,r[v]))

);}inline

void

file()

intmain()

memset

(ans,-1

,sizeof

(ans));

dep[1]

=1;dfs1(1

);dfs2(1

);dp(

1);int res=0;

for(

int i=n,mt=

1;i;

--i,

mul(mt,

23333))

inc(res,

mul(mt,

(ans[i]

%mod+mod)

%mod));

cout

);return0;

}

LCA 樹鏈剖分 線段樹

給出乙個 n 個節點的有根樹 編號為 0 到 n 1 根節點為 0 乙個點的深度定義為這個節點到根的距離 1 設 dep i 表示點 i 的深度,lca i,j 表示 i 與 j 的最近公共祖先。有 q 次詢問,每次詢問給出 l,r,z 求 dep lca i,z 即,求在 l,r 區間內的每個節點...

BZOJ 3252 攻略 貪心 長鏈剖分 線段樹

題目鏈結 實際上,每個點只被統計一次,就是選 k 條最長的不相交的鏈 鏈形態是從上到下的 所以可以想到長鏈剖分。以路徑權值和作為深度,選最長的 k 條長鏈就行了。用nth element就可以把排序的複雜度也省了233.所以複雜度 o n 10236kb 364ms include include ...

poj 3237 樹鏈剖分 線段樹

題意 給一棵樹,三種操作。將第i條邊的權值改為v,將a到b的路徑上的邊的權值全部取反,求a到b路徑上邊的權值的最大值。思路 明顯的樹鏈剖分,加上線段樹的操作。因為有取反的操作所以每個區間要記錄最大值和最小值。查詢兩點間的路徑時,用求公共祖先的方式去求。include include includec...