bzoj4730 Alice和Bob又在玩遊戲

2022-05-21 13:15:06 字數 1135 閱讀 8373

(題目鏈結)

給出乙個森林,兩個人輪流操作,每次把乙個節點以及它的祖先全部抹去,無節點可以抹去是算輸,問是否存在先手必勝策略。

trie樹合併,其實就是線段樹合併。

bzoj4134的簡單版:

二進位制小心寫錯

// bzoj4730

#include#include#include#include#include#include#include#define ll long long

#define inf (1ll<<60)

#define pi acos(-1.0)

#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);

using namespace std;

const int maxn=1000010;

int head[maxn],vis[maxn],sg[maxn],rt[maxn],n,m,sz,cnt,bin[30];

struct edge e[maxn<<1];

struct node

}tr[maxn<<2];

void link(int u,int v) ;head[u]=cnt;

e[++cnt]=(edge);head[v]=cnt;

}void pushdown(int k,int x)

void insert(int &k,int x,int y)

int merge(int x,int y,int k)

void dfs(int x,int fa)

insert(rt[x],t,20); //此時插入的是刪除x所得到的後繼狀態的sg值

for (int i=head[x];i;i=e[i].next) if (e[i].to!=fa)

for (int i=20,p=rt[x];i;i--)

}int main()

int ans=0;

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

if (!vis[i]) dfs(i,0),ans^=sg[i];

puts(ans ? "alice" : "bob");

} return 0;

}

BZOJ4730 Alice和Bob又在玩遊戲

傳送門 首先可以看出這是一道博弈論的題,我們考慮對於每一棵樹求出sg。存在這樣兩種情況 1.去掉根,那麼這棵樹的sg是其所有點的sg異或和。2.去掉子樹中的乙個點,那麼這棵樹的sg是其所有點的sg異或和再異或上這個點到根這條路徑上的所有點sg。對於第一種情況很好處理,而第二種情況暴力做法則是列舉每個...

4730 Alice和Bob又在玩遊戲

time limit 40 sec memory limit 1024 mb submit 116 solved 52 submit status discuss alice和bob在玩遊戲。有n個節點,m條邊 0 m n 1 構成若干棵有根樹,每棵樹的根節點是該連通塊內編號最 小的點。alice和...

Alice和Bob賭糖果 概率 經典

alice和bob賭糖果。規則是這樣的 alice從 l,r 中隨機抽乙個數,bob從 l,r 中隨機抽乙個數,誰抽的數大誰就贏,輸的一方給另一方1顆糖 平局不用給糖 他們會一直賭下去直到有一方沒有糖果為止。alice有n顆糖果,bob有m顆糖果,求alice將bob的糖果贏完的概率。第一行3個整數...