當被傳到球之後,不同的人會做出不同的動作。
第1類人,順著傳來的方向傳給下乙個人。
第2類人,逆著傳來的方向傳給上乙個人。
第3類人,順著傳來的方向傳給下面第二個人。
第4類人,逆著傳來的方向傳給上面第二個人。
現不知是從哪個人開始傳,及開始傳的方向,求有哪些人無論如何,最多只能碰到一次球
顯然可以拆點,一種表順時針傳過來,一種逆時針,連向下乙個點。
那麼就是奇環外向樹森林了,拓撲序求環。
環上的點顯然不合法,考慮鏈上的點
因為第一次可以向兩邊扔,所以判下能不能傳到自己的子樹即可。
code:
#include
#include
#include
#include
#include
#include
using
namespace std;
int n,op[
500010
],d[
1000010
],ys[
1000010
],la[
1000010
],z=0;
vector<
int> vec[
1000010];
struct nodea[
1000010];
int len=
0,last[
1000010];
queue<
int> q;
void
ins(
int x,
int y)
intqs
(int x)
int pr[
500010
],tot=0;
bool vis[
1000010
],ok[
500010];
void
dfs(
int x)
boolin(
int x,
int y)
bool
check
(int x)
intmain()
for(
int i=
1;i<=len;i++
) d[a[i]
.y]++
;memset
(vis,
true
,sizeof
(vis));
for(
int i=
0;i<
2*n;i++)if
(!d[i]
) q.
push
(i);
while
(!q.
empty()
)}for(
int i=
0;i<
2*n;i++)if
(vis[i]
)dfs
(i);
memset
(ok,
true
,sizeof
(ok));
for(
int i=
0;i<
2*n;i++)if
(vis[i]
) ok[i%n]
=false
;for
(int i=
0;iprintf
("%d\n"
,tot)
;for
(int i=
1;i<=tot;i++
)printf
("%d "
,pr[i]);
}
BZOJ3440 傳球遊戲
我們可以考慮拆點,把每個點拆成從左邊過來和從右邊過來兩個,這樣2n個點形成了乙個環套樹森林,乙個人滿足無論如何只能經過一次當且僅當他拆出來的兩個點x和y滿足x不是y的祖先,y不是x的祖先且x,y都不在環上 dfs一下即可 include include include include include...
1763 傳球遊戲
上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師再次吹哨子時,傳球停止,此時,拿著球沒傳出去的那個同學...
傳球遊戲(DP)
演算法訓練 傳球遊戲 時間限制 1.0s 記憶體限制 256.0mb 問題描述 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學...