博弈博弈博弈 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...