bzoj5329 圓方樹 虛樹 戰略遊戲

2021-08-28 10:27:45 字數 3127 閱讀 7511

description

省選臨近,放飛自我的小q無心刷題,於是慫恿小c和他一起頹廢,玩起了一款戰略遊戲。

這款戰略遊戲的地圖由n個城市以及m條連線這些城市的雙向道路構成,並且從任意乙個城市出發總能沿著道路走到

任意其他城市。現在小c已經占領了其中至少兩個城市,小q可以摧毀乙個小c沒占領的城市,同時摧毀所有連線這

個城市的道路。只要在摧毀這個城市之後能夠找到某兩個小c占領的城市u和v,使得從u出發沿著道路無論如何都不

能走到v,那麼小q就能贏下這一局遊戲。 小q和小c一共進行了q局遊戲,每一局遊戲會給出小c占領的城市集合s

你需要幫小q數出有多少個城市在他摧毀之後能夠讓他贏下這一局遊戲。

input

第一行包含乙個正整數t,表示測試資料的組數, 對於每組測試資料, 第一行是兩個整數n和m,表示地圖的城市數和道路數,

接下來m行,每行包含兩個整數u和v~(1<=u10^5, 1<= q<= 10^5,

對於每組測試資料,有sigma|s|<= 210^5

output

對於每一局遊戲,輸出一行,包含乙個整數,表示這一局遊戲中有多少個城市在小q摧毀之後能夠讓他贏下這一局遊戲。

sample input

7 6

1 21 3

2 42 5

3 63 7

2 1 2

3 2 3 4

4 4 5 6 7

6 61 2

1 32 3

1 42 5

3 63 1 2 3

3 1 2 6

3 1 5 6

3 4 5 6

sample output

題解

這題嘛…

把圓方樹建出來

答案就是這些點構成的虛樹中的圓點總數

大力排序一下…

如果根也是圓點的話答案要加1

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mp(x,y) make_pair(x,y)

using

namespace std;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}inline

void

write

(int x)

inline

void

print

(int x)

struct nodea[

410000

],b[

810000];

int len1,last1[

210000

],len2,last2[

410000];

void

ins_a

(int x,

int y)

void

ins_b

(int x,

int y)

int low[

210000

],dfn[

210000

],sta[

210000

],id,cnt,tp;

int r[

210000];

void

link()

void

tarjan

(int x)

while

(i!=y)

;link()

;}}else low[x]

=min

(low[x]

,dfn[y]);

}}int in[

410000

],dpos;

int sum[

410000

],fa[

410000][

25],dep[

410000

],bin[25]

;int n,m,s,po[

210000];

void

pre_tree_node

(int x)}}

intlca

(int x,

int y)

bool

cmp(

int n1,

int n2)

intsol()

int la=

lca(po[s]

,po[1]

);ret+

=sum[po[s]

]+sum[po[1]

]-2*sum[la]

; ret/=2

;if(sum[la]

!=sum[fa[la][0

]])ret++

;return ret;

}int

main()

cnt=n;id=tp=0;

memset

(low,0,

sizeof

(low));

memset

(dfn,-1

,sizeof

(dfn));

tarjan(1

);// for(int i=1;i<=len2;i+=2)printf("%d %d\n",b[i].x,b[i].y);

memset

(sum,0,

sizeof

(sum));

dep[1]

=0;sum[1]

=1;dpos=0;

pre_tree_node(1

);int q=

read()

;while

(q--)}

return0;

}

SDOI2018 戰略遊戲 廣義圓方樹 虛樹

很容易發現一點,題目要我們求的實際上就是我們的新構的樹中的,圓點的個數,所以呢,在這裡我們可以直接通過先利用廣義圓方樹來再求乙個虛樹,我們直接查詢虛樹就可以完成這個要求了。include include include include include include include include ...

bzoj3331 壓力 圓方樹

題目鏈結 圓方樹就是對於聯通無向圖中的每乙個點雙新建乙個方點,與點雙中的每個點連一條邊,然後將原來的邊刪去。將原來的點看作圓點,新建的點看作方點。所以叫做圓方樹。1.圓方樹肯定是棵樹 廢話 證明顯然。2.圓方樹中與圓點相連的點肯定是方點。與方點相連的點肯定是圓點。根據圓方樹的定義就可以知道。構建圓方...

BZOJ2125 最短路 圓方樹

思路 關於靜態仙人掌的問題,建立出圓方樹比較好求解。求出來之後處理每個圓點方點的情況,原來的是樹邊直接處理,環邊的話方點連向環上每個圓點一條邊,權值為每個節點到環的父親節點的最短距離。然後倍增預處理,查詢的時候,如果lc a lca 是圓點直接輸出,否則兩個點是環上的點,處理他們在環上的最短距離即可...