n個點m條邊,每次給出乙個點集,可以刪掉乙個非點集中的點,問有多少刪法使得存在兩個點集中的點不連通。
建出圓方樹的虛樹,顯然刪去上面的圓點是合法的。
直接搞就好了。
code:
#include
#include
#include
#include
#include
#include
using namespace std;
struct nodea[400010];int len,last[200010];
int n,m,dfn[200010],low[200010],cnt,z,sta[200010],top,ys[400010];
int h[400010],tim=0;
vector vec[200010];
struct trnodetr[400010];
void ins(int
x,int
y)void tarjan(int
x,int fa)
vec[cnt].push_back(x);
}else low[x]=min(low[x],low[y]);
}else low[x]=min(low[x],dfn[y]);
}}void pre(int
x,int fa)
}int ans=0,tot[400010],num;
int findlca(int
x,int
y)bool cmp(int a,int b)
while(top>1&&tr[sta[top-1]].dep>=tr[lca].dep) ans+=tr[sta[top]].c-tr[sta[top-1]].c,top--;
if(lca!=sta[top]) ans+=tr[sta[top]].c-tr[lca].c,sta[top]=lca;
sta[++top]=h[i];
}while(top>2) ans+=tr[sta[top]].c-tr[sta[top-1]].c,top--;
if(k>=2||h[1]==1) ans+=tr[sta[top]].c;
else
if(top>1) ans+=(sta[top]<=n);
ans-=num;
}int main()
for(int i=1;i<=cnt;i++) vec[i].clear();
top=z=cnt=0;memset(dfn,0,sizeof(dfn));
tarjan(1,0);
len=0;memset(last,0,sizeof(last));
for(int i=1;i<=cnt;i++)
}tr[0].dep=-1;z=0;pre(1,0);
int q;scanf("%d",&q);
while(q--)
}}
BZOJ5329 SDOI2018 戰略遊戲
補的第一道sdoi2018?圓方樹上建虛樹 歡樂多又多 大霧 大概就是求對於s個點 問刪掉乙個點使它們不完全連通的方案數 那麼我們可以看出 這個其實就是求兩兩路徑並上的割點數量 那麼 圓方樹來解決是最好的辦法 好像也沒有別的辦法 然後我們發現如果兩兩統計lca的話,複雜度是s 2無法接受 可以看出 ...
bzoj 5329 Sdoi2018 戰略遊戲
省選臨近,放飛自我的小q無心刷題,於是慫恿小c和他一起頹廢,玩起了一款戰略遊戲。這款戰略遊戲的地圖由n個城市以及m條連線這些城市的雙向道路構成,並且從任意乙個城市出發總能沿著道路走到 任意其他城市。現在小c已經占領了其中至少兩個城市,小q可以摧毀乙個小c沒占領的城市,同時摧毀所有連線這 個城市的道路...
bzoj5329 圓方樹 虛樹 戰略遊戲
description 省選臨近,放飛自我的小q無心刷題,於是慫恿小c和他一起頹廢,玩起了一款戰略遊戲。這款戰略遊戲的地圖由n個城市以及m條連線這些城市的雙向道路構成,並且從任意乙個城市出發總能沿著道路走到 任意其他城市。現在小c已經占領了其中至少兩個城市,小q可以摧毀乙個小c沒占領的城市,同時摧毀...