維護非常巧妙。。。。看了看網上的做法才知道每個節點可以維護乙個堆qwq
每次詢問相當於求不經過該點路徑的最大權值,所以考慮每次加入一條路徑的時候,將除這條路徑上的所有點更新即可。
所以就用堆來維護。。。開兩個堆,乙個維護壓入堆的元素,乙個維護出堆的元素,查詢時就從top開始往下找直到第乙個不同的地方或者出堆的size為0。
#includeusing namespace std;
const int maxn=1e5+10;
const int maxm=2e5+10;
int n,q,cnt;
int head[maxn],depth[maxn],top[maxn],siz[maxn],fa[maxn],son[maxn];
int nxt[maxm],to[maxm];
int dfn[maxn],ys[maxn],tot;
pairp[maxn];
struct edgeedge[maxm];
struct pathpath[maxn<<1];
struct tree
void del(int x)
int top()
if(!a.empty())
return a.top();
return -1;
}}tr[maxn<<2];
int read()
void add(int x,int y),head[x]=cnt;
edge[++cnt]=(edge),head[y]=cnt;
}void dfs1(int u,int f)
}void dfs2(int u,int tp)
}void update(int root,int l,int r,int l,int r,int key,int type)
int mid=l+r>>1;
if(r<=mid)
update(root<<1,l,mid,l,r,key,type);
else
}int query(int root,int l,int r,int x)
void updatepath(int x,int y,int key,int type)
}int main()
dfs1(1,-1);
dfs2(1,1);
for(int i=1;i<=q;++i)
else
else
} }return 0;
}
洛谷P3250 HNOI2016 網路
題目大意 給定一棵樹。有三種操作 0 u v t 在 u 到 v 的鏈上進行重要度為 t 的資料傳輸。1 x 結束第 x 個時刻的資料傳輸 保證合法 2 x 詢問不經過點 x 的資料傳輸中重要度最大的是多少 無解輸出 1 題解 可以發現一條路徑對所有不在這條路徑上的點有貢獻,所以可以把這些區間給排除...
樹鏈剖分 洛谷 P3384 模板 樹鏈剖分
step1 problem 題目 給你一棵n個點樹,m個操作,r是根,結果取模mod.操作1 格式 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z 操作2 格式 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和 操作3 格式 3 x z 表示將以x為根節點的子樹內所有節...
洛谷 3384 模板樹鏈剖分
如題,已知一棵包含n個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作1 格式 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z 操作2 格式 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和 操作3 格式 3 x z 表示將以x為根節點的子樹內所有節...