傳送門
很明顯是樹鏈剖分,因為是邊權,所以將每個邊權給深度大的那個點可以了,根節點不用賦值,要求最大值和最小值,所以線段樹不包含根節點。因為點是從0編號的,所以父節點和重兒子陣列要初始化。
#include
#include
#include
using
namespace std;
const
int n=
200010
,inf=
0x3f3f3f3f
;int n,m,a[n]
,b[n]
,c[n]
,h[n]
,e[n<<1]
,ne[n<<1]
,w[n<<1]
,idx,col[n]
;void
add(
int a,
int b,
int c)
struct segtree
tr[n<<2]
;void
pushup
(node &rt,node &l,node &r)
void
pushdown
(node &rt,node &l,node &r)
rt.lzy=0;
}void
build
(int rt,
int l,
int r)
;else
;build
(rt<<
1,l,mid)
;build
(rt<<1|
1,mid+
1,r)
;pushup
(tr[rt]
,tr[rt<<1]
,tr[rt<<1|
1]);
}}void
updata
(int rt,
int l,
int r,
int d,
int f)
else tr[rt]
.maxx=tr[rt]
.sum=tr[rt]
.minn=d;
//邊權賦值,單點更新
return;}
int mid=tr[rt]
.l+tr[rt]
.r>>1;
pushdown
(tr[rt]
,tr[rt<<1]
,tr[rt<<1|
1]);
if(l<=mid)
updata
(rt<<
1,l,r,d,f);if
(r>mid)
updata
(rt<<1|
1,l,r,d,f)
;pushup
(tr[rt]
,tr[rt<<1]
,tr[rt<<1|
1]);
return;}
node query
(int rt,
int l,
int r)
}tree;
struct shupo
}void
dfs2
(int u,
int t,
int c)
}void
updata_ed
(int u,
int d)
void
updata_mem
(int x,
int y)
if(dep[x]
>dep[y]
) x^
=y^=x^
=y;if
(dfn[x]+1
<=dfn[y]
) tree.
updata(1
,dfn[x]+1
,dfn[y],0
,1);
//同一條鏈的時候深度高的那個點表示的邊權不在要更新的路徑上,下同
return;}
intquery_sum
(int x,
int y)
if(dep[x]
>dep[y]
) x^
=y^=x^
=y;if
(dfn[x]+1
<=dfn[y]
) ans+
=tree.
query(1
,dfn[x]+1
,dfn[y]
).sum;
return ans;
}int
query_max
(int x,
int y)
if(dep[x]
>dep[y]
) x^
=y^=x^
=y;if
(dfn[x]+1
<=dfn[y]
) ans=
max(ans,tree.
query(1
,dfn[x]+1
,dfn[y]
).maxx)
;return ans;
}int
query_min
(int x,
int y)
if(dep[x]
>dep[y]
) x^
=y^=x^
=y;if
(dfn[x]+1
<=dfn[y]
) ans=
min(ans,tree.
query(1
,dfn[x]+1
,dfn[y]
).minn)
;return ans;
}}t;
intmain()
t.dfs1(0
);t.dfs2(0
,0,0
);tree.
build(1
,2,n);
scanf
("%d"
,&m)
;char op[5]
;int x,y;
while
(m--
)return0;
}
P1505 國家集訓隊 旅遊 樹鏈剖分
題目描述 ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有...
樹鏈剖分 p1505 國家集訓隊 旅遊
ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥...
P1505 國家集訓隊 旅遊
題目鏈結 這道題其實還是比較好想的,同樣是邊權問題。我們需要維護最大值,最小值,和。最坑的地方就是路徑上的所有數變相反數,其實這個就是把區間和 1,區間最大 1,區間最小 1,最後pushdown的時候將取反標記 1,接下來一系列都是常規操作。而這裡還要記住,單點修改時也要下傳lazy標記。而我在跳...