JZOJ5727 色 和 流淚

2021-08-20 05:42:10 字數 3257 閱讀 2194

我們把把乙個遊戲看成在二維平面上玩,一開始在(0

,0) (0,

0)

,從左邊刪x+

1 x+1

,從右邊刪y+

1 y+1

。 那麼假如左邊刪

x x

個,右邊刪

y' role="presentation" style="position: relative;">y

y個,那麼sg

(x,y

)=0 sg(

x,y)

=0

,我們稱之為終止態,那麼和終止態相鄰且不為終止態的點sg

=1s g=

1,稱其為邊界態。

不難發現對於乙個

x x

,終止態只有乙個,而且隨著

x' role="presentation" style="position: relative;">xx增大

y y

是單調不降的,大概就像乙個右上折線。

還有兩個小結論:

1. 假設(x

+1,y

+1)' role="presentation" style="position: relative;">(x+

1,y+

1)(x

+1,y

+1)必敗,那麼(x

,y) (x,

y)

必敗,這個顯然;

2. 假設(x

+1,y

+1),

(x+2

,y+2

) (x+

1,y+

1),(

x+2,

y+2)

都必勝,那麼(x

,y) (x,

y)

必勝。

考慮第二個結論的證明,其實這裡的(x

+2,y

+2) (x+

2,y+

2)

必勝是保證(x

,y+2

),(x

+1,y

+2),

(x+2

,y+1

),(x

+2,y

) (x,

y+2)

,(x+

1,y+

2),(

x+2,

y+1)

,(x+

2,y)

均不為終止態。 因為(

x+1,

y+1)

( x+

1,y+

1)

必勝則(x

+2,y

+1),

(x+1

,y+2

) (x+

2,y+

1),(

x+1,

y+2)

中有乙個必敗。假設是(x

+2,y

+1) (x+

2,y+

1)

必敗,那麼(x

+2,y

) (x+

2,y)

必勝,又因為(x

+1,y

+1) (x+

1,y+

1)

必勝,那麼(x

+1,y

) (x+

1,y)

必敗,那麼(x

,y) (x,

y)

就必勝了。另一種假設同理。

那麼考慮(0

,0),

(1,1

),..

.,(m

,m) (0,

0),(

1,1)

,...

,(m,

m)

這條對角線上((m

,m) (m,

m)

是終止態或者邊界態),那麼只有三種可能:

1. 全為必勝;

2. 全為必敗;

3. (m,

m)( m,

m)

為邊界態必勝,其餘必敗。

那我們只要預處理bi

b

i表示左端點為

i i

,最長的單調區間的右端點的位置(也就是終止態),ci

=max(b

i+1,

bi+1

)' role="presentation" style="position: relative;">ci=

max(bi

+1,b

i+1)

ci=max(b

i+1,

bi+1

)也就是邊界態。就不難二分出

m m

,假如(m

,m)' role="presentation" style="position: relative;">(m,

m)(m

,m)是終止態就是情況2,否則雙方要麼一直刪左邊,要麼一直刪右邊,只要再二分一下兩種情況走到邊界態的長度,然後判一下奇偶性(全奇必敗,有偶必勝)即可。

**:

#include

#include

#include

#include

#define n 1000010

using

namespace

std;

int n,m,ty,a[n],b[n],c[n];

int read()

int main()

for(int i=1;i<=n;i++)

c[i]=max(b[i+1],b[i]+1);

m=read();

while(m--)

if(c[l]>=r)

while(lint len=(l+r)>>1;

if(c[l+len]>=r-len) r=len;

else l=len+1;

}l+=l-1;r-=l-1;

l=0;r=r-l+1;

while(lint len=(l+r)>>1;

if(c[l+len]>=r) r=len;

else l=len+1;

}u=l;

l=0;r=r-l+1;

while(lint len=(l+r)>>1;

if(c[l]>=r-len) r=len;

else l=len+1;

}v=l;

if((u&1)&&(v&1)) puts("liulei");

else

puts("se");

}return

0;}

例題 油田(UVa 572)

輸入乙個m行n列的字元矩陣,統計字元 組成多少個八連塊。如果兩個字元 所在的格仔相鄰 橫豎或者對角線方向 就說他們屬於同乙個八連塊。sample input 1 1 3 5 sample output01 分析 dfs基礎題,典型題。用dfs找聯通塊 從每個 格仔出發,遞迴遍歷它周圍的 格仔。每次訪...

mysql中文亂碼解決 5 7 2

1 資料庫亂碼如下 初始安裝mysql後,character set server 值是latin1.導致存入資料庫的中文顯示?亂碼。解決方法就是修改my.ini檔案 如下 mysqld 下加以下配置 server type 3 mysqld the next three options are m...

5 7 2 動物世界 15分

1 實現mammal類的方法 2 由mammal類派生出dog類,在dog類中增加itscolor成員 color型別 3 dog類中增加以下方法 constructors dog dog int age dog int age,int weight dog int age,color color ...