給定一張簡單無向圖,問有多少對三元組 \((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 中間能選的點就是路徑上的圓點和 因為在乙個點雙連通分量裡面,一定有...