BZOJ 4202石子遊戲 博弈 LCT

2022-09-10 00:09:24 字數 2472 閱讀 3969

博弈博弈博弈 owo

problem 4202. -- 石子遊戲

time limit: 10 sec  memory limit: 128 mb

submit: 57  solved: 20

[submit][status][discuss]石子遊戲是大家都很喜歡玩的一類遊戲,這類遊戲通常與石子的移動和取

舍有關,往往可以讓人在遊戲中獲得不少的樂趣。

有一類樹上石子遊戲的規則是這樣的:在一棵有根樹上,每個節點都有著

一定數目的石子,兩個玩家輪流進行遊戲。每次,每個玩家可以把不超過 m 個

的石子移動到它的父親上。顯然,根節點沒有父親,故每個石子一旦移動到根

節點便無法再次移動。問題是以某個節點為根的子樹進行這樣的遊戲,是否存

在先手必勝策略。

為了增加這個遊戲的難度,我們對這個遊戲進行一些小小的修改。現在,

我們的這棵樹可能會長出新的節點。同時,每個節點上的石子數目可能會變化。

請問,以某個節點為根的子樹進行這樣的石子遊戲,是否存在先手必勝策略。

第一行包含兩個數字 n 和 m,表示初始時有 n 個節點,

每次移動不能超過 m 個。

第二行 n 個正整數 a1,a2...an,表示初始時候的石子數量,其中 1 號節

點為根節點。

接下來 n   1 行,每行兩個整數 u 和 v,表示有一條從 u 到 v 的邊。

接下來一行乙個數 t,表示操作的數目。

接下來 t 行,每行代表乙個操作,每行的第乙個數字代表操作型別,其中:

若為 1,後跟乙個數字 v,表示詢問在 v 的子樹中做遊戲先手是否必勝。

若為 2,後跟兩個數字 x, y 表示將節點 x 的石子數修改為 y。

若為 3,後跟三個數字 u, v, x,表示為 u 節點新增乙個兒子 v,初始石

子數為 x。

對於每乙個詢問,若先手必勝輸出「yes」,否則輸出「no」。

或之前回答為「yes「的數目。

2 1000

0 01 2

11 1no

hint

對於100%的資料, n,t <= 50000。

同時,保證任何時刻樹中節點數目和編號都不會超過 100000。

其餘資料的範圍皆在int範圍內。

題解對於跳到某乙個根,我們可以想到階梯博弈---->將所有奇數高度台階的sg進行nim遊戲,這個就是奇數高度的樹上的sg值進行nim了.其階梯博弈的意義就是如果先手移動偶數台階的棋子,那麼後手必定將移動過來的棋子再移一格使奇偶不變,最終局面不發生改變.

而對於每次不移動超過m,結論就是%(m+1)

那麼這道題就是開兩顆lct,一棵樹維護奇數深度的所有資訊,一棵維護偶數深度的所有資訊,每次修改鏈修改,每次查詢子樹查詢,.

code

#include#include#include#include#include#define zig(x) zigzag(x,1)

#define zag(x) zigzag(x,2)

using namespace std;

const int maxn = 3e5+5;

int n,m;

int a[maxn];

struct lct

if(rev[x])

}void ptdall(int x)

bool isroot(int x)

void zigzag(int x,int dft)

fa[x] = z; fa[y] = x;

if(dft==1) else

}void splay(int x) else else }}

}void acc(int x)

}void setroot(int x)

void link(int x,int ff)

void change(int x,int o)

int query(int x)

}odd,eve;

int la[maxn],en[maxn],nt[maxn],owo,dep[maxn];

void adg(int x,int y)

void dfs(int x,int ba)

if(ba) odd.link(x,ba),eve.link(x,ba);

}char buf[1<<20],*p1,*p2;

#define gc (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?0:*p1++)

inline int r()

int main()

for(int i=1;idfs(1,0);

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

int t; t=r();

int op,x,y,z;

int woc = 0;

for(int i=1;i<=t;i++) else if(op==2) else

}}

BNU4210 石子遊戲 博弈

xsugarx最近參加了一場同學聚會,飯桌上被灌了許多酒水 果汁 調料。不勝酒力的他決定嚴格控制飲品攝入量 但是直接拒絕又顯得太不厚道,於是,他決定和前來灌他的人玩個遊戲。桌上有n個石子,兩人輪流拿,第一次不能把石子全部拿光,以後輪到的人不能比前面人拿的石子多。拿走最後乙個石子的人可以不喝酒。xsu...

877 石子遊戲

題目描述 亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子 piles i 遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。亞歷克斯和李輪流進行,亞歷克斯先開始。每回合,玩家從行的開始或結束處取走整堆石頭。這種情況一直持續到沒有更多的石子堆為止,此時手中石子...

BZOJ3229 石子合併

description 在乙個操場上擺放著一排n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分。input 第一行是乙個數n。以下n行每行乙個數a,表示石子數目。outpu...