xsy1531 北京集訓2016 魔法遊戲

2022-05-22 20:33:07 字數 1021 閱讀 1461

orz sjk

有一棵樹,兩個人每個節點上有乙個權值,兩個人輪流選擇乙個根節點將其權值\(k\)除以\([2,k+1]\)若除到\(0\)就刪去此根節點,它的兒子變成新根節點,刪掉最後乙個點贏。求先手還是後手必勝。

首先考慮一些只有乙個根節點的樹,如果以二進位制角度看,每次除以\([2,k+1]\)的數相當於拿掉一些二進位制位的1,至少拿掉頂上的,可以拿完,這就相當於nim取石頭遊戲。每個權值相當於有\(log_2k+1\)個石頭。

那麼設\(sg(u,i)\)表示節點\(u\)有\(i\)個石頭的\(sg\)值,顯然葉子節點\(u\)的\(sg(u,i)=i\),非葉子節點\(u\)的\(sg(u,0)=sg(son_1(u),k_1(u))\ xor\ sg(son_2(u),k_2(u))\ xor...\) 根據\(sg(u,k)=mex\\) 那麼 \(sg(u,k)=mex \\) 本來\(sg(u,0)=0\)那麼\(sg(u,k)=k\)現在\(sg(u,0)\)等於乙個不為零的數\(x\)那麼\(sg(u,1)=0\ sg(u,2)=1\ ... sg(u,x)=x-1\)直到\(sg(u,x+1)=x+1\).

#includeusing namespace std;

typedef unsigned long long ll;

const int n=100010;

struct ee[n<<1];

int h[n],cnt;

void adge(int f,int t);h[f]=cnt;}

ll mi[100] ,val[n];

int sg[n];

void dfs(int u,int fa)

if(!yz) sg[u]=x-(x<=sg[u]);

else sg[u]=x;}

int main()

dfs(0,0);

puts(sg[0]?"alice":"marisa");

for(int i=0;icnt=-1;

}return 0;

}

(2016北京集訓十四) xsy1557 task

限制可以看成圖狀結構,每個任務的對物品數量的影響可以看成權值,只不過這個權值用乙個五元組來表示。那麼題意要求的就是最大權閉合子圖,網路流經典應用。1 include2 include3 include4 include5 include6 include7 define inf 1000000000...

(2016北京集訓十二) xsy1542 瘋狂求導

這題看起來很難。但是實際上並沒有想象中的那麼難 第一眼看上去不會求導公式怎麼辦?不要緊,題目背景非常良心的給出了題目中的導數計算公式 求完導合併同類項很噁心怎麼辦?不要緊,樣例解釋說明了不需要合併同類項 然後有許多人因為這個爆 了 一看這種題目形式明顯就是大資料結構,外面的序列明顯線段樹維護,次數也...

2016北京集訓 陣列

portal broken qwq 給你乙個陣列,每個元素有乙個顏色,要求支援兩種操作 1 修改某個元素的顏色 2 詢問這個陣列有多少個自取件內沒有重複的顏色 資料範圍 n 10 5,m 2n 顏色大小在 1 sim n 之間 這題。本來應該是乙個樹套樹題 但是為什麼一定要用樹套樹呢對吧qwq 首先...