洛谷3250 網路(樹鏈剖分 堆)

2021-08-30 17:57:06 字數 1256 閱讀 7059

維護非常巧妙。。。。看了看網上的做法才知道每個節點可以維護乙個堆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為根節點的子樹內所有節...