【比赛链接】
【题解链接】
【A】 Kenken Race
【思路要点】
- 首先, A A A 到 C C C 中与 B B B 到 D D D 中不能存在连续的两个障碍物。
- 其次,若 D < C D<C D<C ,需要额外满足 B B B 到 D D D 中存在至少一个空位两侧均为空位。
- 时间复杂度 O ( N ) O(N) O(N) 。
【代码】
#include<bits/stdc++.h> using namespace std; const int MAXN = 2e5 + 5; typedef long long ll; typedef long double ld; typedef unsigned long long ull; template <typename T> void chkmax(T &x, T y) { x = max(x, y); } template <typename T> void chkmin(T &x, T y) { x = min(x, y); } template <typename T> void read(T &x) { x = 0; int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; x *= f; } template <typename T> void write(T x) { if (x < 0) x = -x, putchar('-'); if (x > 9) write(x / 10); putchar(x % 10 + '0'); } template <typename T> void writeln(T x) { write(x); puts(""); } int n, a, b, c, d; char s[MAXN]; int main() { read(n), read(a), read(b), read(c), read(d); scanf("%s", s + 1); for (int i = a; i <= c - 1; i++) if (s[i] == '#' && s[i + 1] == '#') { puts("No"); return 0; } for (int i = b; i <= d - 1; i++) if (s[i] == '#' && s[i + 1] == '#') { puts("No"); return 0; } if (d < c) { bool found = false; for (int i = b; i <= d; i++) if (s[i - 1] == '.' && s[i] == '.' && s[i + 1] == '.') found = true; if (!found) { puts("No"); return 0; } } puts("Yes"); return 0; }
【B】 ABC
【思路要点】
- 将 B C BC BC 看做一个整体,任何操作不会形成新的 B C BC BC ,也不会破坏任何 B C BC BC 。
- 每次操作即交换一对相邻的 A A A 和 B C BC BC ,简单统计即可。
- 时间复杂度 O ( ∣ S ∣ ) O(|S|) O(∣S∣) 。
【代码】
#include<bits/stdc++.h> using namespace std; const int MAXN = 2e5 + 5; typedef long long ll; typedef long double ld; typedef unsigned long long ull; template <typename T> void chkmax(T &x, T y) { x = max(x, y); } template <typename T> void chkmin(T &x, T y) { x = min(x, y); } template <typename T> void read(T &x) { x = 0; int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; x *= f; } template <typename T> void write(T x) { if (x < 0) x = -x, putchar('-'); if (x > 9) write(x / 10); putchar(x % 10 + '0'); } template <typename T> void writeln(T x) { write(x); puts(""); } char s[MAXN]; int main() { scanf("%s", s + 1); int n = strlen(s + 1); ll ans = 0; int now = 0, pos = 1; while (pos <= n) { if (s[pos] == 'A') now++, pos++; else if (s[pos] == 'B' && s[pos + 1] == 'C') ans += now, pos += 2; else now = 0, pos++; } writeln(ans); return 0; }
【C】 Tests
【思路要点】
- 显然,若一场考试玩家得分高于 N P C NPC NPC ,则将其设定为 u i u_i ui ,否则设定为 l i l_i li 。
- 那么,令 g o a l = ∑ i = 1 N b i l i goal=\sum_{i=1}^{N}b_il_i goal=∑i=1Nbili ,玩家在第 i i i 场考试得的前 b i b_i bi 分收益为 l i l_i li ,后 X − b i X-b_i X−bi 分收益为 r i r_i ri ,我们要求总收益大于等于 g o a l goal goal 。
- 二分答案,考虑计算学习 T T T 小时可以获得的收益。
- 注意到 u i ≥ l i u_i\geq l_i ui≥l