luogu3384 模板 樹鏈剖分

2022-09-18 09:07:08 字數 1488 閱讀 4169

省選被暴虐,成功爆0。。。順便ditoly差點全省總分rank1 orz.....

於是開始趕進度學新演算法。。。。

然後決定開始學習樹剖orz。。。

發現樹剖很好用啊!!!!

然後做了模板題。

題目就是給你一棵樹,然後每次操作是查詢或者增加一條樹上2點路徑/子樹的值。

期望時間效率\( o( m \log \log^ n )\).最壞時間複雜度: \( o( m \log^ n )\).

然後貼個版吧。。。

#include #define mn (1<<17)

#define mid ((l+r)>>1)

#define ls (k<<1)

#define rs (k<<1|1)

#define v edge[i].to

#define mn 100005

struct zxyedge[mn<<1

];int mark[mn<<1],sum[mn<<1

],n,son[mn],head[mn],top[mn],siz[mn],val[mn],pos[mn],fa[mn],rpos[mn],dep[mn],mod,cnt,dfsn,q,root;

inline

intin

()inline

void ins(int x,int y)

inline

void dfs1(int u,int f,intd)}

inline

void dfs2(int u,int

tp)inline

void pushdown(int k,int l,int

r)inline

void combine(int k)

inline

void update(int l,int r,int a,int b,int k,int

ad)pushdown(k,l,r);

if (a<=mid) update(l,mid,a,b,ls,ad);

if (b>mid) update(mid+1

,r,a,b,rs,ad);

combine(k);

}inline

int query(int l,int r,int a,int b,int

k)inline

void mupdate(int x,int y,int

ad)inline

int mquery(int x,int

y)void

init()dfs1(root,root,

1);dfs2(root,root);

for (register int i=1; i<=n; ++i) update(1,n,pos[i],pos[i],1

,val[i]);

}void

solve()

else

}else

else}}

}int main()

luogu3384 模板 樹鏈剖分

題目描述 如題,已知一棵包含n個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作1 格式 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z 操作2 格式 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和 操作3 格式 3 x z 表示將以x為根節點的子...

luogu3384 樹鏈剖分

辣雞題目毀我青春!以前寫線段樹,指標從來不賦初值,偏偏這道題乖張,本來應該1a的題目我提交了29遍!我的ac率,我的時間!呃,吐槽完了。還是自己習慣不好 輕重邊剖分之後每個點的tid其實就是它的dfs序。tid陣列順著輸出其實就是樹的先序遍歷 允許我亂用概念吧 那麼以乙個節點為根節點的子樹就是剛進d...

樹鏈剖分 P3384 模板 樹鏈剖分

題目描述 戳這裡 題解 其實樹剖的重點就在於輕重鏈,這篇文章寫的很好 然而我線段樹寫得全是問題,改了半天2333 如下 include include include using namespace std const int maxn 100005 int n,m,root,tt,tot,lnk ...