NOIP2020 移球遊戲

2022-07-10 19:57:15 字數 1951 閱讀 1226

題目鏈結

考慮乙個基本操作,如果有兩個柱子 \(x,y\) 是滿的,\(z\) 是空的,這 \(2m\) 個球中有 \(m\) 個關鍵球,要把所有的關鍵球移到同一根柱子上。

設 \(x\) 柱上有 \(a\) 個關鍵球,操作如下:

(1)把 \(y\) 柱頂部的 \(a\) 個球移到 \(z\) 柱。

(2)把 \(x\) 柱上的球依次移走,如果是關鍵球就移到 \(y\) 柱,否則移到 \(z\) 柱。

(3)把 \(z\) 柱頂部的 \(m-a\) 個球移回 \(x\) 柱,再把 \(y\) 柱頂部的 \(a\) 個球移回 \(x\) 柱。

(4)把 \(x\) 柱頂部的 \(a\) 個關鍵球移到 \(z\) 柱。

(5)把 \(y\) 柱上的球依次移走,如果是關鍵球就移到 \(z\) 柱,否則移到 \(x\) 柱。

這樣結束之後,所有的關鍵球都到了 \(z\) 柱上。

這樣 \(n=2\) 就做完了,\(o(m)\)。

回到原問題,考慮分治:定義分治函式 \(solve(l,r)\),每次定 \(mid=\lfloor\frac2\rfloor\),把 \(\le mid\) 和 \(>mid\) 的球分開,然後進行 \(solve(l,mid)\) 和 \(solve(mid+1,r)\)。

如何分開,可以取出這 \(r-l+1\) 根柱子,每次找兩根柱子,如果這兩根柱子中 \(\le mid\) 的球比 \(>mid\) 的球多,就選 \(m\) 個 \(\le mid\) 的球作為關鍵球,否則選 \(m\) 個 \(>mid\) 的球作為關鍵球,進行一輪以上基本操作,這樣就製造出了乙個滿足所有球都在 \([l,mid]\) 內或所有球都在 \([mid+1,r]\) 內的柱子。

經過 \(r-l\) 輪,所有 \(r-l+1\) 根柱子都滿足這個條件,可以遞迴下去。

操作次數 \(o(nm\log n)\)。

#include template inline void read(t &res)

const int n = 55, m = 405, l = 888888;

int n, m, tot, x[l], y[l], sze[n], a[n][m], em;

bool isx[m], isy[m], vis[n];

void record(int x, int y)

int mer(int x, int y, int mid)

for (int i = 1; i <= m; i++) if (!isx[i] && cntl + cntr < m)

cntl++, isx[i] = 1;

for (int i = 1; i <= cntl; i++) record(y, em);

for (int i = m; i >= 1; i--) record(x, isx[i] ? y : em);

for (int i = 1; i <= m - cntl; i++) record(em, x);

for (int i = 1; i <= cntl; i++) record(y, x);

for (int i = 1; i <= cntl; i++) record(em, y);

for (int i = 1; i <= cntl; i++) record(x, em);

for (int i = m; i >= 1; i--) record(y, isy[i] ? em : x);

int res = em;

return em = y, res;

}void solve(int l, int r)

int main()

solve(1, n);

std::cout << tot << std::endl;

for (int i = 1; i <= tot; i++) printf("%d %d\n", x[i], y[i]);

return 0;

}

NOIP2020 T3移球遊戲

n 個柱子,每個柱子上面 m 個大小相同 顏色不同的球,尋找一種移球方案使得每個柱子上面的球顏色相同。這題思維難度比較高,實現難度不大,考場打了乙個假掉的做法,看了正解以後感覺非常之妙。做法挺自然的,首先考慮只有兩種顏色的情況 對於 n 2 的情況,可以考慮分治,將所有球染為黑白兩色,同顏色的也染為...

NOIP2020 賽前總結

沒有一眼秒的題都必須對拍,這裡對拍包括瘋狂造小資料人工檢查。所以不會的話放心打暴力吧,反正寫出來了也要對拍。碼農題最後碼。預估可能會失誤,不要認為寫一半就丟了很可惜,其他更可做的題沒碰更可惜。想起了就把資料夾複製一遍備份。做大修改前也要備份,多用注釋少用刪除。對拍的資料生成器記得srand。解法極度...

NOIP2020考試總結

比模擬賽還離譜的noip 今年正確密碼 1kao2sheng0jia5you 老師報密碼的方式 1205考生加油。老師 密碼是1205考生加油啊!反正是noip就不搞格式算了 反正入場一眼搞掉 t1 粗略算了一下不會爆 long long 就幹上去了 然後發現少乘一次裂開了 然後大概8 35的樣子就...