題意:求一棵樹上每個點的子樹中經過這個點的所有路徑中邊數在給定範圍內的最長路徑
早上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...