傳送門
樹鏈剖分+線段樹維護的模板題,但要注意的是邊權到點權的轉換以及絕對標記和相對標記的關係。
#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 個結點的樹 連通且無環 每條邊上包含乙...