251023cch模拟赛总结
100 + 40 + 50 + 40 = 230
我怎么T2都做不出,我太菜了qwq
A - string
他们都说做过,但我怎么一点印象都没有qwq
看懂题就看了挺久的还以为左半部分不是从中间分开,看了样例才看懂
然后就是一个非常明显的分治,用
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int n;
string s;
int get_ans (int l, int r, char c) {
if (l == r) {
return s[l] != c;
}
int mid = l + r >> 1, sl = 0, sr = 0;
for (int i = l; i <= r; i++) {
if (i <= mid) {
sl += s[i] != c;
} else {
sr += s[i] != c;
}
}
return min(sl + get_ans(mid + 1, r, c + 1), sr + get_ans(l, mid, c + 1));
}
int main () {
// freopen("string.in", "r", stdin);
// freopen("string.out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> s;
s = ' ' + s;
cout << get_ans(1, n, 'a');
return 0;
}
破案了,是23年春季训练10的F题,我当时甚至做出来了
这是我当时的代码:
#include <bits/stdc++.h>
using namespace std;
long long t, n, f[200010][30];
string s;
long long dfs (int l, int r, int a) {
if (l == r) {
if (s[l] == 'a' + a - 1) {
return 0;
} else {
return 1;
}
}
long long mid = l + r >> 1;
long long ret = min(dfs(l, mid, a + 1) + r - mid - (f[r][a] - f[mid][a]),
dfs(mid + 1, r, a + 1) + mid - l + 1 - (f[mid][a] - f[l - 1][a]));
//cout << l << " " << r << " " << a << " " << ret << endl;
return ret;
}
int main () {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
for (cin >> t; t--;) {
cin >> n >> s;
s = ' ' + s;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 26; j++) {
f[i][j] = f[i - 1][j];
}
f[i][s[i] - 'a' + 1] = f[i - 1][s[i] - 'a' + 1] + 1;
}
cout << dfs(1, n, 1) << endl;
}
return 0;
}
也太丑了qwq
B - shot
很久没见过这么恶心的题了qwq
看懂样例花了
样例解释都不给一个
看完样例之后感觉像贪心,还像
感觉还是更像贪心(实际上正解是
于是枚举往回的时候走到哪。写出来之后发现小样例过了,大样例过不去。但是已经只剩
没想到捞到了
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL N = 1e6 + 5, inf = 1e18;
LL n, a[N], r1, r2, r3, d, s[N][2], f[N], ans;
int main () {
freopen("shot.in", "r", stdin);
freopen("shot.out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> r1 >> r2 >> r3 >> d;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
s[0][1] = inf;
for (int i = 1; i < n; i++) {
LL tmp = min(r2 + d, r1 * a[i] + r1 + d);
f[1] += tmp;
f[i + 1] -= tmp;
tmp = min({r1 * a[i] + r3, r2 + d * 2 + r1, r1 * a[i] + r1 + d * 2 + r1});
s[i][1] = min(s[i - 1][0], s[i - 1][1]) + min(r2 + d * 2 + r1, r1 * a[i] + r1 + d * 2 + r1) + d;
s[i][0] = min(s[i - 1][1] + min(r2 + r1, r1 * a[i] + r1 + r1) + d, min(s[i - 1][0], s[i - 1][1]) + r1 * a[i] + r3 + d);
}
LL sum = 0;
ans = inf;
for (int i = 1; i <= n; i++) {
sum += f[i];
ans = min(ans, sum + min(s[i - 1][0], s[i - 1][1]) + min({r1 * a[n] + r3, r2 + d * 2 + r1, r1 * a[n] + r1 + d * 2 + r1}) + (n - i) * (d + r1));
// cout << sum << ' ' << min(s[i - 1][0], s[i - 1][1]) << ' ' << min({r1 * a[n] + r3, r2 + d * 2 + r1, r1 * a[n] + r1 + d * 2 + r1}) << ' ' << (n - i) * (d + r1) << '\n';
}
cout << ans;
return 0;
}
一大坨shit,又难写又难调qwq
C - array
一眼看上去是我爱吃的数据结构shit(赛后发现确实是我爱吃的线段树
第二眼就不会了:)
首先烧烤一下,一个完整的数组怎么算能删掉几个:
把每个
考虑到只剩
1、2个子任务就按上面讲的
子任务3应该也可以这样做(但是我RE了,不知道为什么)
子任务4就暴力预处理(或者也相当于加了个记忆化)(但是我还是RE了,不知道为什么)
期望得分:80,但是挂了30qwq
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5 + 5;
int n, q, a[N], f[100][100];
int main () {
freopen("array.in", "r", stdin);
freopen("array.out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= 100; i++) {
int sum = 0;
for (int j = i; j <= n; j++) {
int tmp = j - a[j];
if (tmp >= 0 && sum >= tmp) {
sum++;
}
if (n - j < 100) {
f[i - 1][n - j] = sum;
}
}
}
for (int x, y; q--;) {
cin >> x >> y;
if ((n <= 3000 && q <= 3000) || n - (x + y) <= 50) {
int sum = 0;
for (int i = 1 + x; i <= n - y; i++) {
int tmp = i - a[i];
if (tmp >= 0 && sum >= tmp) sum++;
}
cout << sum << '\n';
} else {
cout << f[x][y] << '\n';
}
}
return 0;
}
D - festival
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了
我太菜了