description
省選臨近,放飛自我的小q無心刷題,於是慫恿小c和他一起頹廢,玩起了一款戰略遊戲。input這款戰略遊戲的地圖由n個城市以及m條連線這些城市的雙向道路構成,並且從任意乙個城市出發總能沿著道路走到
任意其他城市。現在小c已經占領了其中至少兩個城市,小q可以摧毀乙個小c沒占領的城市,同時摧毀所有連線這
個城市的道路。只要在摧毀這個城市之後能夠找到某兩個小c占領的城市u和v,使得從u出發沿著道路無論如何都不
能走到v,那麼小q就能贏下這一局遊戲。 小q和小c一共進行了q局遊戲,每一局遊戲會給出小c占領的城市集合s
你需要幫小q數出有多少個城市在他摧毀之後能夠讓他贏下這一局遊戲。
第一行包含乙個正整數t,表示測試資料的組數, 對於每組測試資料, 第一行是兩個整數n和m,表示地圖的城市數和道路數,output接下來m行,每行包含兩個整數u和v~(1<=u10^5, 1<= q<= 10^5,
對於每組測試資料,有sigma|s|<= 210^5
對於每一局遊戲,輸出一行,包含乙個整數,表示這一局遊戲中有多少個城市在小q摧毀之後能夠讓他贏下這一局遊戲。sample input
7 6sample output 題解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
這題嘛…把圓方樹建出來
答案就是這些點構成的虛樹中的圓點總數
大力排序一下…
如果根也是圓點的話答案要加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 是圓點直接輸出,否則兩個點是環上的點,處理他們在環上的最短距離即可...