bzoj 5329 Sdoi2018 戰略遊戲

2021-08-24 17:45:58 字數 1468 閱讀 9135

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沒占領的城市,同時摧毀...