洛谷 P3178 HAOI2015 樹上操作

2022-03-15 16:16:41 字數 1602 閱讀 2111

這篇題解原發於我的blog

這是一道樹鏈剖分的板子題,純粹的模板題事實上模板題比他難

事實上只要做過這道題p3384 【模板】樹鏈剖分就可以我把題目難度提公升了

畢竟我是剛切完板子題的人,初生牛犢不怕虎,直接再打一遍練練手被逼的

記住因為這題沒有提供取模的數,因為\(10^6 \times10^5>2^-1\),所以可能會爆\(int\)

您要是想作死的話也可以,所以這道題只要懶標記和線段樹上的累加\(long\ long\)使用即可,這樣我就過了這道假紫題難題

#include#includeusing namespace std;

#define ll long long

#define re register

#define ls (k<<1)

#define rs (k<<1|1)

templateinline void read(t&x)

while(s>='0'&&s<='9')

if(f)

x=(~x)+1;

return;

}const int n=1e5+10;

#define m (n<<1)

struct edge

edge[m];

int num_edge,head[n];

int n,m,cnt,rk[n],id[n],dep[n],fa[n],top[n],son[n],size[n],num[n];

ll res;

struct tree

tree[n<<2];

inline void add_edge(int from,int to)

inline void dfs1(int u,int f)

}inline void dfs2(int u,int tp)

return;

}inline void pushup(int k)

inline void pushdown(int k)

inline void build(int k,int l,int r)

int mid=l+r>>1;

build(ls,l,mid);

build(rs,mid+1,r);

pushup(k);

return;

}inline void update(int k,int l,int r,int val)

pushdown(k);

int mid=(tree[k].l+tree[k].r)>>1;

if(l<=mid)

update(ls,l,r,val);

if(mid>1;

if(l<=mid)

query(ls,l,r);

if(middep[y])

swap(x,y);

res=0;

query(1,id[x],id[y]);

ans+=res;

return ans;

}int main()

{ read(n),read(m);

for(re int i=1; i<=n; ++i)

read(num[i]);

for(re int i=1,x,y; i馬蜂差評

洛谷P3178 HAOI2015 樹上操作

有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。輸入格式 第一行包含兩個整數 n,m 表示點數和運算元。...

洛谷P3178 HAOI 2015 樹上操作

題目 樹剖裸題,這個題更可以深刻的理解樹剖中把樹上的節點轉換為區間的思想。要注意在區間上連續的節點,一定是在一棵子樹中。include define int long long define ls left,mid,root 1 define rs mid 1,right,root 1 1 defi...

洛谷 P3178 HAOI2015 樹上操作

有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。輸入格式 第一行包含兩個整數 n,m 表示點數和運算元。...