Codeforces Round #731 (Div. 3) A~G 解題記錄
比賽連結:Here
1547A. Shortest Path with Obstacle
3個點 \(A,B,F\) ,前提 \(F\) 點為不可經過點,問 \(A\to B\) 最短路徑長度
A題沒什麼難度,注意同列和同行在兩者之間的情況即可
【AC Code】
int main() { cin.tie(nullptr)->sync_with_stdio(false); int _; for (cin >> _; _--;) { int a, b, c, d, e, f; cin >> a >> b >> c >> d >> e >> f; int s = abs(a - c) + abs(b - d); if (a == c && a == e && (f > b && f < d || f > d && f < b) || b == d && b == f && (e > a && e < c || e > c && e < a)) s += 2; cout << s << '\n'; } }
1547B. Alphabetical Strings
構造出一個按 字母序
的字串
- 首先,構造空串
- 重複 \(n\) 次:\(s:=c + s\) or \(s: = s + c\)
-
首先,我們如果可以找出字母“a”在字串s中的位置。如果這個位置不存在,那麼答案是
NO
-
假設這個位置存在並且等於 \(pos_a\)。讓我們建立兩個指標L和R。最初 \(L:=pos_a\),\(R:=L\)。我們將嘗試使用語句中的演算法來左右構建字串 \(s\)
當我們能迭代 \(n\) 次時輸出
YES
,否則 輸出NO
【AC Code】
int main() { cin.tie(nullptr)->sync_with_stdio(false); int _; for (cin >> _; _--;) { function<int(string)> check = [&](string s) { if (s.empty())return 1; if (s[0] == 'a' + s.size() - 1)return check(s.substr(1)); if (s.back() == 'a' + s.size() - 1)return check(s.substr(0, s.size() - 1)); return 0; }; string s; cin >> s; cout << (check(s) ? "YES\n" : "NO\n"); } }
1547C. Pair Programming
一項工作有 Monocarp 和 Polycarp 兩人各 \(n\) 和 \(m\) 工時合作完成
他們都有兩種操作:
0
,新新增一行x > 0
,在第x
行上修改為x
但這項工作原本已經存在 \(k\) 行被完成,請 Monocarp 和 Polycarp 操作的任何正確公共序列,如果不存在則輸出 -1
模擬,
對於兩人的操作 \(x\) 是不能超過 \(k\) 的,所以使用雙指標模擬兩人的操作即可
【AC Code】
int main() { cin.tie(nullptr)->sync_with_stdio(false); int _; for (cin >> _; _--;) { int k, n, m; cin >> k >> n >> m; vector<int>a(n), b(m), ans; for (int &x : a)cin >> x; for (int &x : b)cin >> x; for (int i = 0, j = 0; i < n or j < m;) { if (i < n and a[i] <= k) { k += a[i] == 0; ans.push_back(a[i++]); } else if (j < m and b[j] <= k) { k += b[j] == 0; ans.push_back(b[j++]); } else break; } if (ans.size() != n + m)cout << "-1\n"; else { for (int i : ans)cout << i << " "; cout << "\n"; } } }
1547D. Co-growing Sequence
-
如同 \([2,3,15,175]_{10} \to [10_2,11_2,1111_2,10101111_2]\)
$[0,0,0] \to [0_2,0_2,0_2] $
均為增長序列
現在給一個長度為 \(n\) 的 \(x_i\) 陣列,請輸出一組 \(y_i\) 使得 \(x_i ⊕ y_i\) 為增長序列
思路待補
【AC Code】
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n; cin >> n;
int x, p = 0;
for (int i = 0; i < n; ++i) {
cin >> x;
cout << (p | x) - x << " ";
p |= x;
}
cout << "\n";
}
}
1547E. Air Conditioners
對於每個位置的空調的最小值來說肯定是和左右(+1)比較
【AC Code】
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n, k;
cin >> n >> k;
vector<int> a(n, 2e9), v(k), t(k);
for (int &x : v) cin >> x;
for (int &x : t) cin >> x;
for (int i = 0; i < k; ++i)a[v[i] - 1] = t[i];
for (int i = 1; i < n; ++i) a[i] = min(a[i - 1] + 1, a[i]);
for (int i = n - 2; i >= 0; --i)a[i] = min(a[i + 1] + 1, a[i]);
for (int x : a)cout << x << " ";
cout << "\n";
}
}
1547F. Array Stabilization (GCD version)
【AC Code】
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n, d = 0;
cin >> n;
vector<int> v(n * 2);
for (int i = 0; i < n; i++) {
cin >> v[i];
v[i + n] = v[i];
d = __gcd(d, v[i]);
}
int ans = 0;
vector<pair<int, int>>vt;
for (int i = 2 * n - 1; i >= 0; i--) {
vector<pair<int, int>> wp;
vt.push_back({0, i});
for (auto [x, y] : vt) {
x = __gcd(x, v[i]);
if (not wp.empty() and x == wp.back().first) wp.back().second = y;
else wp.push_back({x, y});
}
swap(vt, wp);
if (i < n) ans = max(ans, vt[0].second - i);
}
cout << ans << "\n";
}
}
1547G. How Many Paths?
鄰接表 + 樹形DP
【AC Code】
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n, m;
cin >> n >> m;
vector<vector<int>> G(n), H(n);
for (int i = 0, u, v; i < m; i += 1) {
cin >> u >> v;
u -= 1;
v -= 1;
G[u].push_back(v);
H[v].push_back(u);
}
vector<int> order, id(n);
function<void(int)> dfs1 = [&](int u) {
id[u] = -1;
for (int v : H[u])
if (not id[v])dfs1(v);
order.push_back(u);
};
for (int i = 0; i < n; i += 1) if (not id[i]) dfs1(i);
reverse(order.begin(), order.end());
int count = 0;
function<void(int)> dfs2 = [&](int u) {
id[u] = count;
for (int v : G[u])
if (not ~id[v])
dfs2(v);
};
for (int i : order) if (not ~id[i]) {
dfs2(i);
count += 1;
}
vector<vector<int>> g(count);
for (int i = 0; i < n; i += 1)
for (int j : G[i]) {
g[id[i]].push_back(id[j]);
assert(id[i] >= id[j]);
}
vector<int> dp(count);
for (int i = id[0]; i >= 0; i -= 1) {
if (i == id[0]) dp[i] = 1;
if (dp[i]) {
for (int j : g[i]) if (j == i) dp[i] = -1;
}
for (int j : g[i]) {
if (dp[i] == -1) dp[j] = -1;
if (dp[i] == 2 and dp[j] != -1) dp[j] = 2;
if (dp[i] == 1 and dp[j] != -1 and dp[j] <= 1) dp[j] += 1;
}
}
for (int i = 0; i < n; i += 1) cout << dp[id[i]] << " ";
cout << "\n";
}
}
The desire of his soul is the prophecy of his fate
你靈魂的慾望,是你命運的先知。