APIO2018 Duathlon 鐵人兩項

2022-06-04 11:09:06 字數 2504 閱讀 5188

點這裡看題目。

首先,我們很容易看出,在 \(s\) 和 \(f\) 確定時,\(c\) 的備選數量就等於\(s\)到\(f\)所有簡單路徑的並的大小減二(要把\(s\)和\(f\)去掉)。

隨手畫幾個圖就會發現, \(s\) 到 \(f\) 所有簡單路徑的並似乎也就是\(s\)到\(f\)經過的所有點雙的並

考慮證明這個猜想。首先,由於點雙之間最多只有乙個公共點,所以每個點雙內,每條從 \(s\) 到 \(f\) 的簡單路徑,必然是從乙個固定點進入點雙,從另乙個固定點離開

因而我們只需要再證明:在點雙內部,對於任意三點\(a, b, c\),必然存在簡單路徑滿足從\(a\)到\(c\)到\(b\)。

為了方便,以下用\(u\oversetv\)表示從\(u\)向\(v\)連一條容量為\(c\)的邊。

考慮構建乙個網路來證明,如下:

拆點。對於\(u\)拆成\(u\)和\(u'\),並且連線\(u\overset u'\),表示每個點只能經過一次。

拆邊。無向邊先要拆成有向邊。對於有向邊\((u,v)\),連線\(u'\overset v\),表示邊只能經過一次。

連線源匯。連線\(s\overset c, a'\overset t,b'\overset t\)。

這樣,如果原圖最大流為 \(2\) ,則存在需要的路徑。

也就是說,我們需要證明,原圖最大流,也即是最小割為 \(2\) 。

設最小割為\(c\)。顯然\(c\le 2\)。那麼我們需要證明\(c>1\),即不可以只刪除一條邊就使得\(s\)到\(t\)不連通。

分類討論:

如果刪除 \(u\overset u'\) 的邊,我們就相當於拆掉了乙個點。根據點雙的定義,不影響連通性。

如果刪除 \(u'\overset v\) 的邊,我們就相當於拆掉了一條邊。由於這個操作影響比拆點更小,因而也不影響連通性。

刪除\(a'\overset t\)或者是\(b'\overset t\)。顯然只刪除一邊而另一邊留存都不會影響連通性。

因而有\(c>1\),根據連邊特性我們知道就有\(c=2\),即命題成立。

這也就是說,我們的猜想也是成立的。

因而我們只需要統計任意兩點之間,經過的點雙的並的大小減二即可。

考慮建出圓方樹,這樣任意兩點之間經過的點雙就是路徑上的方點。

下面需要使用到乙個技巧:為圓方樹上的點賦合適的權

這一題中,我們首先可以猜想給方點賦為點雙大小。由於兩個點雙之間最多只有乙個交點,因而我們可以直接給圓點賦為 \(-1\) 進行扣除多餘貢獻。同時,圓點賦 \(-1\) 也能順帶處理 " 並集大小減二 " 這個情況。

總結一下,我們給圓點賦 \(-1\) ,方點賦大小,然後統計任意兩個圓點之間路徑的權值和即可。建出圓方樹後一邊 dfs 計算答案即可。時間\(o(n)\)。

#include typedef long long ll;

const int maxn = 2e5 + 5, maxm = 2e6 + 5;

templatevoid read( _t &x )

while( s >= '0' && s <= '9' )

x *= f;

}templatevoid write( _t x )

if( 9 < x )

putchar( x % 10 + '0' );

}template_t min( const _t a, const _t b )

struct graph

graph[maxm << 1];

int head[maxn] = {}, cnt;

graph()

void addedge( const int from, const int to )

void adde( const int from, const int to )

void nxt( int &ptr ) const

edge& operator ( const int indx )

}g, t;

int stk[maxn];

int siz[maxn], w[maxn];

int dfn[maxn], low[maxn];

ll ans;

int n, m, cnt, id, top, tot, subn;

void tarjan( const int u, const int fa )

}else low[u] = min( low[u], dfn[v] );

}}void dfs( const int u, const int fa )

ans += 2ll * siz[u] * ( subn - siz[u] ) * w[u];

}int main()

write( ans ), putchar( '\n' );

return 0;

}

2018APIO 進京趕考

先見識了一下ctsc的操作。漲了見識。打鐵匠x1 見識了個全英文的ppt,各種講課其實真的講的很好,只是邏輯性太強反而讓完全不會的同學有些尷尬。linux真的令人窒息。guide用不起就算了,控制台除錯。報錯直接密密麻麻打5頁螢幕看都看不懂。編譯都編譯不起我還玩個啥?我就聽懂了凱老師的講課,彈幕令人...

遊記 APIO2018遊記

update 雞排真好吃,明年有機會再來北京van明天就要去北京浪了,於是在模擬apio2015前嘗試去做了hash,很愉快地wa了,就開始了模擬apio2015的比賽。a題亂搞,c題亂搞,b題結果暴力都沒寫出來。感覺這為後面暴力沒搞出來暴力打好了堅實的基礎 hdhd過金牌線。總體還是很愉快的,每個...

APIO2018 鐵人兩項

題意 在乙個無向圖裡面選三個點 s c f 需要能夠從 s 出發,經過 c 到達 f 點,中間不能提前經過 f 且需要是乙個簡單路徑 solution 簡單路徑當然就是園方樹了,想想怎麼統計答案 yy一下可以發現,有一條路徑 s f 中間能選的點就是路徑上的圓點和 因為在乙個點雙連通分量裡面,一定有...