補的第一道sdoi2018?
圓方樹上建虛樹 歡樂多又多【大霧
大概就是求對於s個點 問刪掉乙個點使它們不完全連通的方案數
那麼我們可以看出 這個其實就是求兩兩路徑並上的割點數量
那麼 圓方樹來解決是最好的辦法【好像也沒有別的辦法
然後我們發現如果兩兩統計lca的話,複雜度是s^2無法接受
可以看出 這個過程和虛樹的構建過程十分相似
所以 我們就可以建出虛樹 統計答案即可
附**。
#include#include#include#include#include#define inf 20021225
#define ll long long
#define mxm 200100
#define mxn 100100
using namespace std;
struct edgep[mxm<<1],t[mxm<<1],e[mxm<<1];
// p 原圖 t 虛樹 e 圓方樹
int ip[mxn],it[mxn<<1],in[mxn<<1];
int cnp,cntt,cnt,pt,poi[mxm],n,m;
int dfn[mxn<<1],low[mxn],dep[mxn<<1],tot;
int f[mxn<<1][20],g[mxn<<1];
int stk[mxn<<1],num;bool spc[mxn<<1];
// 注意不要用混!!!
void add(int x,int y)
void att(int x,int y)//只建兒子邊
stacktt;
void tarjan(int x,int ff)
while(tmp!=y);
}} else
low[x]=min(low[x],dfn[y]); }}
void dfs(int x)
}void maketree()//建圓方樹
int lca(int x,int y)
else if(dfn[z]1) att(stk[stk[0]-1],stk[stk[0]]),stk[0]--;
}void query(int x)
spc[x]=0;
}void init()
int main()
} return 0;
}
bzoj 5329 Sdoi2018 戰略遊戲
n個點m條邊,每次給出乙個點集,可以刪掉乙個非點集中的點,問有多少刪法使得存在兩個點集中的點不連通。建出圓方樹的虛樹,顯然刪去上面的圓點是合法的。直接搞就好了。code include include include include include include using namespace s...
bzoj 5329 Sdoi2018 戰略遊戲
省選臨近,放飛自我的小q無心刷題,於是慫恿小c和他一起頹廢,玩起了一款戰略遊戲。這款戰略遊戲的地圖由n個城市以及m條連線這些城市的雙向道路構成,並且從任意乙個城市出發總能沿著道路走到 任意其他城市。現在小c已經占領了其中至少兩個城市,小q可以摧毀乙個小c沒占領的城市,同時摧毀所有連線這 個城市的道路...
bzoj5329 圓方樹 虛樹 戰略遊戲
description 省選臨近,放飛自我的小q無心刷題,於是慫恿小c和他一起頹廢,玩起了一款戰略遊戲。這款戰略遊戲的地圖由n個城市以及m條連線這些城市的雙向道路構成,並且從任意乙個城市出發總能沿著道路走到 任意其他城市。現在小c已經占領了其中至少兩個城市,小q可以摧毀乙個小c沒占領的城市,同時摧毀...