APIO2018 Duathlon 鐵人兩項

2022-09-19 13:12:13 字數 1131 閱讀 9092

給定一張簡單無向圖,問有多少對三元組 \((s,c,f)\)(\(s,c,f\) 互不相同)使得存在一條簡單路徑從 \(s\) 出發,經過 \(c\) 到達 \(f\)。

很顯然先建出圓方樹,然後考慮 \((s,c,f)\) 存在的數量

我的一般想法是考慮固定 \(c\) 統計 \((s,f)\) 的數量

這確實用了樹的性質,但沒用到圓方樹的性質,而且因為點雙的討論,使統計非常複雜

後來看了看正解,頗有一種如獲至寶的感覺

考慮固定 \(s,f\) 統計 \(c\) 的數量,那就是 \(s\) 到 \(f\) 所有簡單路徑點的並集大小 \(-2\)(即除去 \(s,f\))

貌似也並不好弄,然而放到圓方樹上就成了路徑上圓點和方點所連的圓點的個數

於是不難想到將方點權值賦為與其相連圓點個數,圓點權值賦為 \(-1\)

\(s\) 到 \(f\) 所有簡單路徑點的並集大小即為路徑上的點權和

統計的話,換種思考角度,變為統計乙個點的點權的貢獻,這就很簡單了

#include #include #define re register

#define in inline

using namespace std;

typedef long long ll;

const int n = 2e5 + 5;

int n, m, cnt, top, tot1, tot2, dfc;

int val[n], h1[n], h2[n], low[n], dfn[n], siz[n], stk[n];

ll ans;

struct edgee1[n * 5], e2[n * 5];

in void add1(int x, int y), h1[x] = tot1;}

in void add2(int x, int y), h2[x] = tot2;}

void tarjan(int x)

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

void dfs(int x, int fa)

ans += 2ll * val[x] * siz[x] * (dfc - siz[x]);

}int main()

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 中間能選的點就是路徑上的圓點和 因為在乙個點雙連通分量裡面,一定有...