日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[APIO2018]铁人两项——圆方树+树形DP

發布時間:2025/4/14 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [APIO2018]铁人两项——圆方树+树形DP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:

[APIO2018]鐵人兩項

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

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

#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int n,m; int x,y; vector<int>q[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) {tot++;next[tot]=head[x];head[x]=tot;to[tot]=y; } void insert(int x,int y) {q[x].push_back(y); } void tarjan(int x) {st[++top]=x;low[x]=dfn[x]=++num;for(int i=head[x];i;i=next[i]){if(!dfn[to[i]]){tarjan(to[i]);low[x]=min(low[x],low[to[i]]);if(low[to[i]]>=dfn[x]){insert(++cnt,x);insert(x,cnt);int now=0;do{now=st[top--];insert(cnt,now);insert(now,cnt);}while(now!=to[i]);}}else{low[x]=min(low[x],dfn[to[i]]);}} } void dfs(int x,int fa) {vis[x]=1;size[x]=(x<=n?1:0);int len=q[x].size();for(int i=0;i<len;i++){int to=q[x][i];if(to!=fa){dfs(to,x);size[x]+=size[to];}} } void tree_dp(int x,int fa) {int len=q[x].size();for(int i=0;i<len;i++){int to=q[x][i];if(to!=fa){tree_dp(to,x);}}if(x<=n){for(int i=0;i<len;i++){int to=q[x][i];if(to!=fa){ans+=1ll*size[to]*(sum-size[to]-1);}else{ans+=1ll*(sum-size[x])*(size[x]-1);}}}else if(len>=3){for(int i=0;i<len;i++){int to=q[x][i];if(to!=fa){ans+=1ll*size[to]*(sum-size[to])*(len-2);}else{ans+=1ll*(sum-size[x])*size[x]*(len-2);}}} } int main() {scanf("%d%d",&n,&m);cnt=n;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}for(int i=1;i<=n;i++){if(!dfn[i]){tarjan(i);}}for(int i=1;i<=cnt;i++){if(!vis[i]){dfs(i,0);sum=size[i];tree_dp(i,0);}}printf("%lld",ans); }

轉載于:https://www.cnblogs.com/Khada-Jhin/p/10346332.html

總結

以上是生活随笔為你收集整理的[APIO2018]铁人两项——圆方树+树形DP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。