HHKB Programming Contest 2023(AtCoder Beginner Contest 327)
HHKB Programming Contest 2023(AtCoder Beginner Contest 327)
A - ab
int main() {
IOS;
string s;
cin >> n >> s;
bool f = false;
for (int i = 1; i < n; ++i)
if (s[i - 1] == 'a' && s[i] == 'b') f = true;
else if (s[i] == 'a' && s[i - 1] == 'b') f = true;
cout << (f ? "Yes" : "No");
return 0;
}
B - A^A
int main() {
IOS;
cin >> n;
int f = -1;
for (int i = 1, j = 1; true; ++i, j = 1) {
ll s = 1;
for (; j <= i && s <= n / i; ++j) s *= i;
if (j <= i || s > n) break;
if (s == n) { f = i; break; }
}
cout << f;
return 0;
}
C - Number Place
int a[9][9], f[9];
int main() {
IOS;
rep (i, 0, 8) rep (j, 0, 8) cin >> a[i][j], --a[i][j];
bool g = true;
rep (i, 0, 8) {
memset(f, 0, sizeof f);
rep (j, 0, 8) {
f[a[i][j]] |= 1, f[a[j][i]] |= 2;
f[a[i / 3 * 3 + j / 3][i % 3 * 3 + j % 3]] |= 4;
}
rep (j, 0, 8) if (f[j] != 7) g = false;
}
cout << (g ? "Yes" : "No");
return 0;
}
D - Good Tuple Problem
判断二分图
int h[N], to[M], ne[M], tot;
int a[M >> 1], color[N];
void add(int u, int v) {
ne[++tot] = h[u];
to[h[u] = tot] = v;
}
bool dfs(int x, int c) {
color[x] = c;
for (int i = h[x], y = to[i]; i; y = to[i = ne[i]]) {
if (color[y] == c) return false;
if (!color[y] && !dfs(y, -c)) return false;
}
return true;
}
int main() {
IOS;
cin >> n >> m;
rep (i, 1, m) cin >> a[i];
rep (i, 1, m) cin >> k, add(a[i], k), add(k, a[i]);
bool f = true;
rep (i, 1, n) {
if (color[i]) continue;
if (!dfs(i, 1)) { f = false; break; }
}
cout << (f ? "Yes" : "No");
return 0;
}
E - Maximize Rating
dp
\(x_k = \textstyle \sum_{i=1}^{k} 0.9^i\)
$y_k = \frac{1200}{ \sqrt{k} } $
\(d_k = max(\textstyle \sum_{i=1}^{k} 0.9^i \times Q_i)\)
\(ans = max(\frac{d_k}{x_k} - y_k)\)
int a[N];
double x[N], y[N], d[N];
int main() {
IOS;
cin >> n; x[0] = 0, y[0] = 1;
double ans = -1500, z = 1;
rep (i, 1, n) {
cin >> a[i], x[i] = z + x[i - 1], z *= 0.9, y[i] = 1200 / sqrt(i);
d[i] = -1500;
per (j, i, 1) {
d[j] = max(d[j], d[j - 1] * 0.9 + a[i]);
ans = max(ans, d[j] / x[j] - 1200 / y[j]);
}
}
cout << precision(6) << ans;
return 0;
}
F - Apples Editorial
扫描线
const int N = 2e5 + 5;
int n, m, _, k, cas;
vector<PII> st[N];
struct BIT {
struct Node {
int l, r, val, tag;
} tr[N << 2];
void push_up(int rt) {
tr[rt].val = max(tr[rt << 1].val, tr[rt << 1 | 1].val);
}
void push_down(int rt) {
tr[rt << 1].val += tr[rt].tag;
tr[rt << 1 | 1].val += tr[rt].tag;
tr[rt << 1].tag += tr[rt].tag;
tr[rt << 1 | 1].tag += tr[rt].tag;
tr[rt].tag = 0;
}
void build(int rt, int l, int r) {
tr[rt].l = l, tr[rt].r = r;
tr[rt].val = tr[rt].tag = 0;
if (l == r) return;
int mid = l + r >> 1;
build(rt << 1, l, mid); build(rt << 1 | 1, mid + 1, r);
}
void change(int rt, int l, int r, int k) {
if (tr[rt].l >= l && tr[rt].r <= r) {
tr[rt].val += k;
tr[rt].tag += k;
return;
}
push_down(rt);
int mid = tr[rt].l + tr[rt].r >> 1;
if (mid >= l) change(rt << 1, l, r, k);
if (mid < r) change(rt << 1 | 1, l, r, k);
push_up(rt);
}
int ask(int rt, int l, int r) {
if (tr[rt].l >= l && tr[rt].r <= r) return tr[rt].val;
push_down(rt);
int mid = tr[rt].l + tr[rt].r >> 1;
if (r <= mid) return ask(rt << 1, l, r);
if (l > mid) return ask(rt << 1 | 1, l, r);
return max(ask(rt << 1, l, r), ask(rt << 1 | 1, l, r));
}
} bit;
int main() {
IOS;
int d, w; cin >> n >> d >> w;
rep (i, 1, n) {
int t, x; cin >> t >> x;
st[max(1, t - d + 1)].emplace_back(x, 1);
st[t + 1].emplace_back(x, -1);
}
bit.build(1, 1, N - 5);
int ans = 0;
for (int i = 1; i <= N - 5; ++i) {
for (auto &p : st[i]) {
bit.change(1, max(1, p.first - w + 1), p.first, p.second);
}
ans = max(ans, bit.ask(1, 1, N - 5));
}
cout << ans;
return 0;
}