Skip to content

Commit aa57018

Browse files
committed
第十一届中国大学生程序设计竞赛 哈尔滨站(CCPC 2025 Harbin Site)
1 parent 8d4c290 commit aa57018

File tree

3 files changed

+180
-0
lines changed

3 files changed

+180
-0
lines changed

14819.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* @file 14819.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2025-11-11
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
15+
#define maxn 1000005
16+
#define mod 1'000'000'007
17+
18+
int64_t f[maxn], g[maxn], h[maxn], a[maxn], mul[maxn], sum[maxn];
19+
20+
void solve(void) {
21+
int n, x;
22+
cin >> n >> x;
23+
mul[0] = sum[0] = 1;
24+
for (int i = 1; i <= n; i++) cin >> a[i], sum[i] = (sum[i - 1] + (mul[i] = mul[i - 1] * a[i] % mod)) % mod;
25+
26+
auto add = [&](int64_t &x, int64_t y) -> int64_t { return x = (x + y) % mod; };
27+
28+
int64_t ans = mul[n];
29+
for (int i = 1; i <= n; i++) f[i] = g[i] = h[i] = 0;
30+
f[n + 1] = 1, g[n + 1] = h[n + 1] = 0;
31+
for (int i = n + 1; i >= 1; i--) {
32+
if (i > 1 && a[i] > 1) add(h[i - 1], h[i]);
33+
if (i > 2 && a[i] == 1) add(h[i - 2], h[i]);
34+
35+
if (a[i] > 1) add(f[i], h[i]), add(g[i], h[i] * (a[i] - 2));
36+
if (i > 2 && a[i - 2] == a[i]) add(f[i - 2], h[i]);
37+
if (i > 1) add(f[i - 1], h[i]), add(g[i - 1], h[i] * (a[i - 1] - 1));
38+
39+
if (i > 1) add(f[i - 1], f[i]), add(g[i - 1], f[i] * (a[i - 1] - 1));
40+
if (i > 2) add(h[i - 2], f[i]);
41+
42+
if (i > 1) add(f[i - 1], g[i]), add(g[i - 1], g[i] * (a[i - 1] - 1));
43+
if (i > 1) add(h[i - 1], g[i]);
44+
45+
if (i > 2) add(ans, (sum[i - 3] + mul[i - 3] * (a[i - 2] - 1)) % mod * f[i]);
46+
if (i > 1) add(ans, (sum[i - 2] + mul[i - 2] * (a[i - 1] - 1)) % mod * g[i]);
47+
if (i > 1 && a[i] > 1) add(ans, (sum[i - 2] + mul[i - 2] * (a[i - 1] - 1)) % mod * h[i]);
48+
if (i > 2 && a[i] == 1) add(ans, (sum[i - 3] + mul[i - 3] * (a[i - 2] - 1)) % mod * h[i]);
49+
}
50+
51+
cout << ans << endl;
52+
53+
return;
54+
}
55+
56+
int main() {
57+
ios::sync_with_stdio(false), cin.tie(nullptr);
58+
59+
int _ = 1;
60+
cin >> _;
61+
while (_--) solve();
62+
63+
return 0;
64+
}

14820.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
* @file 14820.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2025-11-11
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
15+
#define maxn 1005
16+
17+
int64_t a[maxn][maxn];
18+
19+
void solve(void) {
20+
int n, m;
21+
cin >> n >> m;
22+
for (int i = 1; i <= n; i++)
23+
for (int j = 1; j <= m; j++) cin >> a[i][j];
24+
map<int, int64_t> S;
25+
int64_t ans = 0;
26+
for (int i = 1; i <= n; i++)
27+
for (int j = 1; j <= m; j++) {
28+
if (a[i][j] >= 0) {
29+
S[j] += a[i][j];
30+
continue;
31+
}
32+
auto it = S.upper_bound(j);
33+
while (it != S.begin() && a[i][j] < 0) {
34+
it--;
35+
int64_t v = min(it->second, -a[i][j]);
36+
it->second -= v, a[i][j] += v;
37+
}
38+
ans += abs(a[i][j]);
39+
}
40+
for (auto [x, v] : S) ans += v;
41+
cout << ans << endl;
42+
return;
43+
}
44+
45+
int main() {
46+
ios::sync_with_stdio(false), cin.tie(nullptr);
47+
48+
int _ = 1;
49+
cin >> _;
50+
while (_--) solve();
51+
52+
return 0;
53+
}

14825.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* @file 14825.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2025-11-11
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
15+
#define maxn 15
16+
17+
int X[maxn], Y[maxn];
18+
19+
void solve(void) {
20+
int n, m, k;
21+
cin >> n >> m >> k;
22+
for (int i = 0; i < k; i++) cin >> X[i] >> Y[i];
23+
for (int S = 0; S < (1 << k); S++)
24+
cout << [&](void) -> int {
25+
int xl = 1, xr = n, pl = 1, pr = n, y = 1, d = 0;
26+
for (int l = 0, r; l < k; l = r + 1) {
27+
r = l;
28+
while (r + 1 < k && Y[r + 1] == Y[l]) r++;
29+
30+
int ql = 1, qr = n;
31+
for (int i = l; i <= r; i++)
32+
if (S >> i & 1)
33+
ql = max(ql, X[i] + 1);
34+
else
35+
qr = min(qr, X[i] - 1);
36+
if (ql > qr) return -1;
37+
38+
if (Y[l] == 1) {
39+
l = ql, r = qr;
40+
continue;
41+
}
42+
if (Y[l] == y + 1 && (pr < ql || qr < pl)) return -1;
43+
if (xr < ql) d += ql - xr, xl = xr = ql;
44+
if (xl > qr) d += xl - qr, xl = xr = qr;
45+
xl = max(xl, ql), xr = min(xr, qr);
46+
d += Y[l] - y, y = Y[l];
47+
pl = ql, pr = qr;
48+
}
49+
return d + (m - y);
50+
}() << ' ';
51+
cout << endl;
52+
return;
53+
}
54+
55+
int main() {
56+
ios::sync_with_stdio(false), cin.tie(nullptr);
57+
58+
int _ = 1;
59+
cin >> _;
60+
while (_--) solve();
61+
62+
return 0;
63+
}

0 commit comments

Comments
 (0)