ACGO挑战赛#24题解
2025-11-02 22:00:33
发布于:江苏
T1
w = 0 # 小午杯子当前的水量
f = 0 # 小枫杯子当前的水量
for _ in range(k):
if w == a:
# 小午杯子装满,喝掉
w = 0
else:
if f == 0:
# 小枫杯子空,装满
f = b
else:
# 从小枫倒入小午
need = a - w # 小午还能装的量
pour = min(need, f) # 实际倒入的量
w += pour
f -= pour
print(w, f)
T2
a = list(map(int, input().split()))
head = 0
for i in range(n):
if a[i] == -1:
head = i + 1
break
next_node = [0] * (n + 1)
for i in range(n):
num = i + 1
ai = a[i]
if ai != -1:
next_node[ai] = num
result = []
current = head
for _ in range(n):
result.append(str(current))
current = next_node[current]
print(' '.join(result))
T3
n = int(input())
a = list(map(int, input().split()))
current_sum = 0
min_sum = 0
for num in a:
current_sum += num
if current_sum < min_sum:
min_sum = current_sum
x = max(0, -min_sum)
print(x + current_sum)
T4
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 60;
char grid[MAXN][MAXN + 1];
int dist[MAXN][MAXN][MAXN][MAXN];
struct State {
int r1, c1, r2, c2;
};
int dr[4] = {-1, 1, 0, 0};
int dc[4] = {0, 0, -1, 1};
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> grid[i];
}
// 找两个 P 的位置
int r1 = -1, c1, r2, c2;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 'P') {
if (r1 == -1) {
r1 = i;
c1 = j;
} else {
r2 = i;
c2 = j;
}
}
}
}
memset(dist, -1, sizeof(dist));
queue<State> q;
dist[r1][c1][r2][c2] = 0;
q.push({r1, c1, r2, c2});
while (!q.empty()) {
State cur = q.front();
q.pop();
int step = dist[cur.r1][cur.c1][cur.r2][cur.c2];
if (cur.r1 == cur.r2 && cur.c1 == cur.c2) {
cout << step << endl;
return 0;
}
for (int d = 0; d < 4; d++) {
int nr1 = cur.r1 + dr[d];
int nc1 = cur.c1 + dc[d];
int nr2 = cur.r2 + dr[d];
int nc2 = cur.c2 + dc[d];
// 检查边界和障碍
if (nr1 < 0 || nr1 >= n || nc1 < 0 || nc1 >= n || grid[nr1][nc1] == '#') {
nr1 = cur.r1;
nc1 = cur.c1;
}
if (nr2 < 0 || nr2 >= n || nc2 < 0 || nc2 >= n || grid[nr2][nc2] == '#') {
nr2 = cur.r2;
nc2 = cur.c2;
}
if (dist[nr1][nc1][nr2][nc2] == -1) {
dist[nr1][nc1][nr2][nc2] = step + 1;
q.push({nr1, nc1, nr2, nc2});
}
}
}
cout << -1 << endl;
return 0;
}
T6
#include <bits/stdc++.h>
using namespace std;
class FenwickTree {
private:
vector<int> tree;
int n;
public:
FenwickTree(int size) : n(size), tree(size + 2, 0) {}
void update(int idx, int delta) {
for (; idx <= n; idx += idx & -idx) {
tree[idx] += delta;
}
}
int query(int idx) {
int sum = 0;
for (; idx > 0; idx -= idx & -idx) {
sum += tree[idx];
}
return sum;
}
int range_query(int l, int r) {
if (l > r) return 0;
return query(r) - query(l - 1);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
string s;
cin >> s;
vector<int> d(n, 0);
for (int i = 0; i < n - 1; ++i) {
if (s[i] == s[i + 1]) {
d[i] = 1;
} else {
d[i] = 0;
}
}
FenwickTree ft(n - 1);
for (int i = 0; i < n - 1; ++i) {
if (d[i] == 1) {
ft.update(i + 1, 1);
}
}
while (q--) {
int type, L, R;
cin >> type >> L >> R;
if (type == 1) {
if (L > 1) {
int i = L - 2;
int old_val = d[i];
int new_val = 1 - old_val;
ft.update(i + 1, new_val - old_val);
d[i] = new_val;
}
if (R < n) {
int i = R - 1;
int old_val = d[i];
int new_val = 1 - old_val;
ft.update(i + 1, new_val - old_val);
d[i] = new_val;
}
} else {
if (L == R) {
cout << "Yes\n";
} else {
int a=L;
int b=R - 1;
int sum=ft.range_query(a, b);
if (sum == 0) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
}
}
return 0;
}
有问题回复我。
这里空空如也












有帮助,赞一个