牛客練習賽63 牛牛的樹行棋

2021-10-06 03:30:49 字數 3143 閱讀 8561

題意如上

思路:

很好的一道樹上博弈。。。首先需要看出來是sg博弈(並且知道sg博弈)

知道之後 如果能猜到sg函式的表示就差不多啦,結論是:sg[x]=到達子樹中最深的葉子節點的長度。

那麼怎麼猜呢???葉子節點無法在向下延伸,sg=0.那麼葉子節點的father只能向下延伸一步,合理的猜想過後sg=1。之後balabala就能得出 這個結論:結論是:sg[x]=到達子樹中最深的葉子節點的長度。雖然我是看題解猜出來的

之後就是應有的套路,sg異或和xorsum。如果xorsum=0 先手必敗。否則先手必剩。這個很簡單一遍dfs即可得出來

之後考慮第二個問題,當xorsum!=0時,如何操作可以讓異或和等於0.balabala。。。很明顯如果兩個節點的異或和為xorsum(這兩個節點是屬於跟與子樹上的節點的關係)那麼我們就可以把該根節點移動到該子樹上的這個節點上。就會神奇的發現現在行異或和就是0…哈哈哈,俺就可以贏了

那麼問題又來了,如何求任意兩個節點的異或值為xorsum且屬於跟與子樹的關係呢?

myway:抓住乙個節點 向上找(上面的節點肯定都可能成為他的跟) 可以用dfs 進出棧的特點。維護到當前節點的這條鏈的值為k的數量cnt[k],每次sum+=cnt[xorsum^sg[u]]即可

otherway:抓住乙個節點向下找 (下面的所以節點都可能成為答案) 也是dfs 差分的思想 進入這個節點時減去cnt[xorsum^sg[u]] ,出去這個節點的時候加上 xorsum^sg[u]即可

myway:

void

dfs2

(int u,

int fa)

v[sg[u]]--

;}

dalaoway

void

dfs2

(int x,

int f )

ans+

=cnt[mx[x]

^res]

;}

完整**

#pragma gcc optimize(3,"ofast","inline")  	

//g++

#include

#define mem(a,x) memset(a,x,sizeof(a))

#define debug(x) cout << #x << ": " << x << endl;

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define fcout cout

namespace std;

typedef

long

long ll;

//***********************************===

namespace fastio

void

print()

template

<

typename t,

typename..

. t2>

inline

void

read

(t &x, t2 &..

. oth)

while

(isdigit

(ch)

)x *

= f;

read

(oth...

);}template

<

typename t,

typename..

. t2>

inline

void

print

(t x, t2.

.. oth)

while

(x/=10)

;while

(p3>=0)

putchar

(print_f[p3--])

;putchar

(' ');

print

(oth...

);}}

// namespace fastio

using fastio::print;

using fastio::read;

//***********************************===

typedef pair<

int,

int> pii;

const

int inf=

0x3f3f3f3f

;const

int mod=

1e9+7;

const

int maxn =

1e6+5;

vector<

int>edge[maxn]

;int sg[maxn]

,v[maxn]

;int n,res,ans;

void

add(

int x,

int y)

intdfs

(int u,

int fa)

sg[u]

=max-sg[u]

;return max;

}void

dfs2

(int u,

int fa)

v[sg[u]]--

;}intmain()

dfs(1,

0);for

(int i=

1;i<=n;i++)if

(res==0)

else

// cout<

//**************************************

#ifndef online_judge

cerr <<

"time:"

<<

clock()

- c1 <<

"ms"

<< endl;

#endif

return0;

}

牛客練習賽63 B牛牛的魚缸

題目描述 牛牛有乙個長為l,寬為1,高為h的魚缸,現在他想要在魚缸中盛一些水。他想要知道這個魚缸最多能夠放多少水。當然這個問題太過於簡單,所以牛牛將這個魚缸放到了乙個長為l,高為h的斜坡上面,如圖所示,魚缸寬度為1的這條邊緊緊靠在斜坡與地面的交界線上。在不允許移動魚缸與斜坡的情況下。魚缸最多能夠放多...

牛客練習賽63 C

lin klink link 題意 牛牛有一排菜園,長度為n,第 i ii 塊菜園的菜的高度為a i a i a i 第i ii天,第i ii塊菜園的高度會增加1,第n 1 n 1n 1天第1塊菜園的高度增加1,一次類推。但是牛牛有一種魔法,它可以使得一塊菜園的高度加1,或者減1,問至少需要多少天才...

牛客練習賽63 牛牛的揠苗助長 二分)

題目傳送門 牛牛有一塊長度大小為n的菜園,他首先對這塊菜園從1到n進行了編號,每一塊地分別為1號 2號 n號菜地,然後他往每塊菜地中都種下了一些水稻,一開始,第i塊菜地中的水稻高度均為a i 個單位。然後我們知道水稻的生長週期都是n天,也就是說每逢n天水稻就會長高乙個單位。但是不巧的是整個菜園中每一...