第五場太抽象了,失去補題慾望
6
A Cake (A)
首先假設字串已經確定,對Oscar而言,由於一份蛋糕可以為空,在兩人都儘可能取最大值的情況下,相當於忽略所有空的部分、只根據字串的某個字首 \(s'\) 劃分蛋糕,按照字串中0佔比最大的字首平均劃分一定是最優的。回到遊戲第一步,已知Oscar的目標,Grammy移動時應當讓最優 \(s'\) 中0佔比儘可能小,而Oscar應使之儘可能大,可用類似樹上dp的思路求解。
學習了xht賽時的dfs函式,比我那坨程式碼好多了······
double dfs(int f, int i, int it, int cnt1, int cnt2, double mx) {
if(v[i].size() == 1 && v[i][0].t == f) return mx;
double ans = it;
for(int j = 0; j < v[i].size(); j++) {
int t = v[i][j].t, k = v[i][j].k;
if(t == f) continue;
int x1 = cnt1 + (1 ^ k), x2 = cnt2 + 1;
if(it) {
ans = min(ans, dfs(i, t, it ^ 1, x1, x2, max(mx, x1 * 1.0 / x2)));
} else {
ans = max(ans, dfs(i, t, it ^ 1, x1, x2, max(mx, x1 * 1.0 / x2)));
}
}
return max(ans, mx);
}
B.Cake 2 (B)
找規律題,似乎xcpc的簽到偏愛找規律()畫圖觀察每塊蛋糕的分佈位置可得,\(k \leq n/2\) 時,\(ans=n*k+1\),其中特判 \(k*2=n\) 時 \(ans=n\);\(k > n / 2\) 時同理考慮 \(n-k\) 即可。
D.Puzzle: Wagiri (D)
(說起來Wagiri是什麼意思呢,好奇)
由無向邊的環結構想到邊雙連通分量,被保留的輪邊必須位於某個分量內部;再用類似縮點的思想,將每個邊雙連通分量當作一個點考慮,被保留的切邊恰好將所有點連成一棵樹。先對所有輪邊計算邊雙連通分量、再對所有切邊計算生成樹,最後並查集檢驗連通性即可。注意邊雙的程式碼比縮點多一個對邊的特判。
主要程式碼如下,將不合法邊的型別記作-1,便於輸出:
for(int i = 1; i <= n; i++) {
if(!dfn[i]) tarjan(i, 0);
}
for(int i = 1; i <= n; i++) {
if(r[col[i]]) f[find(i)] = find(r[col[i]]);
else r[col[i]] = i;
}
int cntm = 0;
for(int i = 1; i <= m; i++) {
int x = e[i].f, y = e[i].t;
if(e[i].id) {
if(find(x) != find(y)) {
f[find(x)] = find(y);
cntm++;
} else {
e[i].id = -1;
}
} else {
if(col[x] != col[y]) {
e[i].id = -1;
} else cntm++;
}
}
int cnt = 0;
for(int i = 1; i <= n; i++) {
if(f[i] == i) cnt++;
}
if(cnt > 1) {
printf("NO");
return 0;
}
printf("YES\n");
printf("%d\n", cntm);
for(int i = 1; i <= m; i++) {
if(e[i].id >= 0) {
printf("%d %d\n", e[i].f, e[i].t);
}
}