P1505 國家集訓隊 旅遊 (樹鏈剖分)

2021-10-24 14:46:30 字數 3065 閱讀 5770

傳送門

很明顯是樹鏈剖分,因為是邊權,所以將每個邊權給深度大的那個點可以了,根節點不用賦值,要求最大值和最小值,所以線段樹不包含根節點。因為點是從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標記。而我在跳...