SDOI2018 戰略遊戲

2022-03-26 19:56:21 字數 1145 閱讀 4903

題目

圓方樹其實並沒有那麼難

圓方樹的構建比較簡單,就是乙個tarjan把點雙跑出來,對於每乙個點雙我們多建乙個方點,把原圖中的點稱為圓點,將點雙內所有圓點向方點連邊,之後我們就得到了原圖的圓方樹

關於圓方樹的性質,zyb大爺在他的題解裡寫了很多,這裡就不再抄一遍了

至於這道題,就是把圓點拿出來建棵虛樹,割虛樹上的圓點就會使得點集不連通了

那麼如何求虛樹中的圓點個數呢,我們可以將圓點的點權放到其連向父親的那條邊上去,這樣統計虛樹的邊權和就好了;特殊的,當虛樹的最高點為圓點時,它連向父親的邊不在虛樹里,所以需要額外計算

**,就是tarjan板子和虛樹板子,寫起來爽就是了

**

#include#define re register

#define min(a,b) ((a)<(b)?(a):(b))

const int maxn=2e5+7;

inline int read()

struct ee[maxn<<1];

int n,m,num,pre[maxn],head[maxn],sum[maxn],cnt,pt[maxn],top[maxn];

int st[maxn],son[maxn],dfn[maxn],ans,dep[maxn],top,fa[maxn],rn;

inline int cmp(int a,int b)

}void dfs2(int x,int topf)

inline int lca(int x,int y)

namespace build e[maxn<<1];

int cnt,top,num;

int head[maxn>>1],dfn[maxn>>1],low[maxn>>1],st[maxn>>1];

inline void add_(int x,int y)

void tarjan(int x,int fa) while(st[top--]!=e[i].v);

add(x,n);

}}else if(x!=fa) low[x]=min(low[x],dfn[e[i].v]);

} inline void solve()

}int main()

} return 0;

}

SDOI2018 戰略遊戲

給定一張 n 個點 m 條邊的無向聯通圖,共有 q 次操作,每次操作選擇一些點作為關鍵點,詢問有多少個點滿足刪去該點及與其相鄰的邊後,至少有兩個關鍵點不能互相到達。n,q leq 10 5,m leq 2 cdot 10 5,sum s leq 2 cdot 10 5 還是挺簡單的。就是圓方樹 虛樹...

SDOI2018 戰略遊戲

time limit 30 sec memory limit 512 mb submit 12 solved 9 submit status discuss 省選臨近,放飛自我的小q無心刷題,於是慫恿小c和他一起頹廢,玩起了一款戰略遊戲。這款戰略遊戲的地圖由n個城市以及m條連線這些城市的雙向道路構成...

解題 SDOI2018 戰略遊戲

題面 先圓方樹然後建虛樹,答案就是虛樹大小。虛樹沒必要建出來,把原來的點的點權設為1,直接dfs序排序後相鄰點求距離加上首尾兩個點的距離,最後除以二 畫一下可以發現是正反算了兩遍 注意還要去掉詢問點和補上首尾兩個點的lca 1 include2 include3 include4 include5 ...