P4315 月下「毛景樹」 樹鏈剖分 線段樹

2021-09-21 18:34:54 字數 1556 閱讀 2980

傳送門

樹鏈剖分+線段樹維護的模板題,但要注意的是邊權到點權的轉換以及絕對標記和相對標記的關係。

#include #include #include #include using namespace std;

typedef long long ll;

const int n = 1e5 + 10;

struct edge

edge[n<<1];

struct node //記錄邊的資訊

node[n];

int n, a[n], cnt, head[n], max[n<<2], lazy[n<<2], lazy1[n<<2]; //lazy記錄絕對標記,lazy1記錄相對標記

int top[n], son[n], f[n], size[n], id[n], rk[n], dep[n];

void add_edge(int from,int to,int cost)

void dfs1(int v,int fa,int depth)

}void dfs2(int v,int tp)

}void pushup(int rt)

void pushdown(int rt)

if(lazy1[rt] != 0)

}void build(int l,int r,int rt)

int m = (l+r)>>1;

build(l,m,rt<<1);

build(m+1,r,rt<<1|1);

pushup(rt);

}void update(int l,int r,int c,int type,int l,int r,int rt)

else

return ;

}int m = (l+r)>>1;

if(l <= m) update(l,r,c,type,l,m,rt<<1);

if(m < r) update(l,r,c,type,m+1,r,rt<<1|1);

pushup(rt);

}int querymax(int l,int r,int l,int r,int rt)

//由於將邊權轉化成了點權,那麼lca的點權是不屬於我們所查詢的路徑的

int querymaxs(int a,int b)

if(id[a] > id[b]) swap(a,b);

return max(ans, querymax(id[a]+1,id[b],1,n,1));

}void updates(int a,int b,int c,int type)

if(id[a] > id[b]) swap(a,b);

update(id[a]+1,id[b],c,type,1,n,1);

}int main()

cnt = 0;

dfs1(1,0,0);

dfs2(1,1);

build(1,n,1);

while(cin>>oper && oper != "stop")

else

}return 0;

}

P4315 月下「毛景樹」(樹鏈剖分)

毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。爬啊爬 爬啊爬毛毛蟲爬到了一顆小小的 毛景樹 下面,發現樹上長著他最愛吃的毛毛果 毛景樹 上有n個節點和n 1條樹枝,但節點上是沒有毛毛果的,毛毛果都是長在樹枝上的。但是這棵 ...

P4315 月下「毛景樹」

毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。爬啊爬 爬啊爬毛毛蟲爬到了一顆小小的 毛景樹 下面,發現樹上長著他最愛吃的毛毛果 毛景樹 上有n個節點和n 1條樹枝,但節點上是沒有毛毛果的,毛毛果都是長在樹枝上的。但是這棵 ...

題解 P4315 月下「毛景樹」

看原題戳這兒 如題,肯定是樹鏈剖分的題。建議先a掉這道模板題 不會的先看這個 前置知識 鏈式前向星,樹,dfs序,lca,樹形dp,線段樹,樹鏈剖分 一定要先完全學懂,否則不保證這篇題解能完全看懂!先簡化題目 已知一棵包含 n 0 le n le 100000 個結點的樹 連通且無環 每條邊上包含乙...