這篇題解原發於我的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 表示點數和運算元。...