這次終於進小機房了QwQ,可是這樣就得離開葉隊了,啊,這可太不好了呀
雖然小機房沒有氛圍吧,但是有種不一樣的感覺
聯賽模擬測試14
A 虎
- 看到這道T1我十分蒙,沒啥思路,尤其是不知道那些可以不用變成黑邊的怎么處理,然后就打了父親都是1的和全是黑邊的,后者還打掛了。
- 其實這道題和昨天的Graph特別像,也是偶數條邊就不用往上傳,奇數條邊,如果x能傳就傳上去,一個Dfs就搞定了。
bool Dfs(int x) {
bool b = 0;
for (int i = head[x]; i; i = e[i].next) {
int y = e[i].t;
if (!Dfs(y)) continue;
if (b) ans++;
b = !b;
}
if (b && !w[x]) ans++;
return ((w[x] == 1) || (b && w[x] == 2));
}
int main() {
n = read();
for (int i = 2; i <= n; ++i) {
Add(read(), i);
int y = read(), z = read();
w[i] = !z ? 2 : y ? 0 : 1;
}//w為0表示不能改變,1表示需要改變,2表示可以改變
Dfs(1);
printf("%d\n", ans);
return 0;
}
B 陶陶摘蘋果
- 一開始看錯題了以為是求最長上升子序列,一看20分5000的數據\(O(n^2log(n))\)就不想做了,但一看還有3個小時,T3又那么惡心,就肝這道題。寫完最長上升子序列后突然發現讀錯題了,直接O(n)掃m遍,這就很可做。
- 后來想了想怎么優化,就想到了改一個點都會改那些,發現對前面是沒有影響的,然后在改的地方后面找第一個大於前面最大值的點,預處理出來這個點到最后的答案就好了
- 然后我就開始了無盡的預處理,先O(n)的把1~i的答案求出來,在用ST表+二分查找+線段樹區間加把i~n的答案求出來,最后詢問的時候在用二分回答。
- 最后切掉了這道題,說實話感覺真不賴
C 開心的金明
- 一看這麻煩的題面整個人都傻了,瞎打了個暴力就去肝T2了,最后得了20分,就是兩個樣例
- 正解貪心,模擬一下過程。
- 用set維護結構體,表示電腦的價格和數量,每次都買最便宜的,如果超過e限制,就每次刪最貴的,
D 笨小猴
- 這個題之前學長講過,當時挺在狀態,想了一會就想出來了,就是按a從小到大排序,然后每兩個都選b值大的那個,最后把a值最大的選上,一定能保證b值符合條件,然后畫個柱狀圖找最差情況模擬一下就知道這是對的。
聯賽模擬測試13
A Tree
- 考試時用最大生成樹的思路瞎推了推,發現可能是邊權加起來,然后對拍起來沒啥問題,就這樣了A了
B Permutation (Unaccepted)
- 能往后放的就往后放,本來以為是TLE50分,結果是WA了,看別人都90分,問了問葉隊,得多跑幾遍,然后我加個while(1)就90分了QwQ
C Graph
- 這道題前20分的點沒過,就把樹的點過了。
其實其它圖的解法和樹的非常類似,對於每個聯通塊先搞出一棵Dfs樹來,反祖邊就把祖先拆開一個點成為子節點,然后按照樹處理就好了(不用真的拆開,只是一種思路)
bool Dfs(int x, int fa) {
dfn[x] = ++dfc;
int a, b = 0;
for (int i = head[x]; i; i = e[i].next) {
int y = e[i].t;
if (y == fa || dfn[y] > dfn[x]) continue;
if ((dfn[y] && dfn[y] < dfn[x]) || Dfs(y, x)) {
if (b) ans[++cnt] = (Node) {a, x, y}, b = 0;
else a = y, b = 1;
}
}
if (fa && b) ans[++cnt] = (Node) {a, x, fa};
return !b;
}
D 十字綉
- 這個題都寫過題解,但考試的時候只回想起了一丟丟,暴力還不會打,於是愉快的拿到了10分的好成績,
晚間測試5
真是越考名次越低,總名次都掉到第8了 QwQ
A 容易題
- 考場上發現將每位能選的數的和相乘就是答案,拍了拍沒啥問題,然后100%的數據就用map搞了搞就過去了。
B 兔子與櫻花
- 看了半天沒看懂題,瞎打了個暴力水了20分。
正解是貪心,從葉子節點往上搜,每個節點的子節點能刪就刪(先按貢獻從小到大排序)
聯賽模擬測試12
爆了20分。
A 松鼠的新家
- 樹上差分板子題。
B trade
- 堆優化反悔貪心,每次找前面最小的,如果有比當前小的,算在答案里,並且另加入一遍這個點的價值,如果后面選了這個點,就相當於在這時買了又賣。
C sum
- 本來1~4,11~16都可以暴力碾過去,但是寫的時候沒注意,11~14單獨寫了一種方法,然后不知怎么就掛了,只拿了40分
因為從\(S_{n, m}\)可以O(1)得推到\(S_{n,m+1},S_{n,m-1},S_{n+1,m},S_{n-1, m}\),詢問可以離線,可以將詢問想成區間,這樣就可以用莫隊來解決,然后葉隊手把手教了我奇偶優化莫隊(葉隊太巨了!)。
\[S_{n,m+1}=S_{n,m}+C_n^{m+1} \]
\[S_{n,m-1}=S_{n,m}-C_n^m \]
\[S_{n+1,m}=2\times S_{n,m}-C_n^m \]
\[S_{n-1,m}=\frac{S_{n,m}+C_{n-1}^m}{2} \]
D building (Unaccepted)
- 前4個點沒對,5~8個點對了可真是神奇,前20分的代碼還改了一次,但還是掛了,只拿了20分。
晚間測試4
A 字符串
- 一看見題目上說1的個數不能少於0的個數,那就往卡特蘭數上想。把坐標系畫出來后不知道到對稱點的方案樹怎么求,只能打了個表,算出來結果是\(C(n+m,m)-C(n+m,m-1)\)
B 哪一天她能重回我身邊 (Unaccepted)
- 暴力Dfs的時候回溯的時候逗號達成分號,然后僅有的20分沒了...
聯賽模擬測試11
這次狀態還可,掛了-20分
純暴力選手Rank3???
A One
- 線性約瑟夫問題,考試的時候打了30分暴力,前7名就我30分,別人都是60,100。
然而在網上並沒有找到這類題的題解,就問了xyx和lzs,正解是推式子,從0開始編號,最后剩下一個肯定是0號,然后推出在2個人的時候是幾號,最后推出在n個人的時候是幾號
int x = 0;
for (int i = 2; i <= n; ++i)//當前序列有多少人
x = (x + n - i + 1) % i;
printf("%d\n", x + 1);
B 磚塊
- 大模擬,12種情況稍微想想就出來了。
C 數字 (Unaccepted)
- 考場上想了個錯誤的80分寫法,對拍拍出來了,然后把20分的代碼加上個預處理,拿了50分。
D 甜圈
-
打了個50分n2暴力,結果數據水,拿了70分
-
正解是將工作順序看成一字符串,寫個線段樹維護一下Hash值,然后區間加,區間乘。可是乘法標記和加法標記混一塊的實在是想不明白,若竹兄上課講的那種方法和我考場想的特別像,然后我就按若竹的提示想了出來。
-
將T個工作拍到線段樹上,每個節點儲存做的工作區間,[0, 0]表示還沒有工作,[-1, -1]表示不合法,然后大力Pushdown一下就可以了,自己想出來可真是高興