省選被暴虐,成功爆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 ...