APIO2018 鐵人兩項 圓方樹 樹形DP

2022-05-08 03:09:09 字數 989 閱讀 3217

[apio2018]鐵人兩項

對於點雙連通分量有乙個性質:在同乙個點雙里的三個點$a,b,c$,一定存在一條從$a$到$c$的路徑經過$b$且經過的點只被經過一次。

那麼我們建出原圖的圓方樹,列舉中間點$b$,一對合法的$a,c$需要使這兩個點位於與$b$直接相連的方點的不同子樹中。樹形$dp$,對圓點和方點分別統計答案即可。

#include#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

int n,m;

int x,y;

vectorq[200010];

int head[100010];

int to[400010];

int next[400010];

int size[200010];

int low[100010];

int dfn[100010];

int tot;

int cnt;

int num;

int st[100010];

int top;

int vis[200010];

ll ans;

int sum;

void add(int x,int y)

void insert(int x,int y)

void tarjan(int x)

while(now!=to[i]);

}} else

}}void dfs(int x,int fa)

else

} }}

int main()

for(int i=1;i<=n;i++) }

for(int i=1;i<=cnt;i++) }

printf("%lld",ans);

}

APIO2018 鐵人兩項 圓方樹

給定一張無向圖,詢問存在多少三元組 s,c,f s,c,f s,c,f s,c,fs,c,f s,c,f各不相同 滿足存在一條從s ss到c cc,c cc到f ff的簡單路徑。n 1 05,m 105 n leq 10 5,m leq 10 5 n 105,m 10 5考慮建立圓方樹。固定s f ...

APIO2018 鐵人兩項

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

APIO2018 Duathlon 鐵人兩項

給出一張無向圖,問有多少組點a,b,c滿足存在至少一條從a經過b到c的簡單路徑。首先考慮列舉點a,c,這樣每一組a,c對答案的貢獻就是可能在ac路徑之間出現的點的個數,然後我們可以對圖建圓方樹,使圓點的點權為 1 去重 方點的點權為點雙的大小,這樣ac路徑之間出現的點的個數就是a,c兩點在圓方樹上的...