3440 傳球遊戲

2021-09-09 07:20:29 字數 1827 閱讀 5620

當被傳到球之後,不同的人會做出不同的動作。

第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個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學...