題意如上
思路:
很好的一道樹上博弈。。。首先需要看出來是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天水稻就會長高乙個單位。但是不巧的是整個菜園中每一...