AtCoder Regular Contest 133 题解 A - C
2022/1/23 6:05:16
本文主要是介绍AtCoder Regular Contest 133 题解 A - C,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文地址
视频讲解
A - Erase by Value
贪心, 找到第一个出现的相邻逆序.
#include <bits/stdc++.h> using namespace std; #define inc(x, l, r) for (int x = l; x <= r; x++) const int maxn = 1e6 + 5; int a[maxn]; int main() { int n; cin >> n; inc(i, 1, n) cin >> a[i]; int x = a[n]; inc(i, 1, n - 1) { if (a[i] > a[i + 1]) { x = a[i]; break; } } vector<int> v; inc(i, 1, n) if (a[i] != x) v.push_back(a[i]); inc(i, 0, (int)v.size() - 1) cout << v[i] << " \n"[i == (int)v.size() - 1]; }
B - Dividing Subsequence
从左到右扫描 \(p[]\), 如果当前 \(p_i\) 匹配 \(q_j\), 则所有 \(q_k(k < j)\) 不再能与后续 \(p_l(l > i)\) 匹配, 自然想到 dp[p] 为当前 \(p[]\) 只与 \(q_i(i\leq p)\) 的最大匹配值.
\[dp[p] = max(dp[p], \max_{1\leq i\leq p-1}{dp[i]} + 1) \]为了 \(logn\) 地单点修改和区间查询最大值, 我们可以用线段树或者树状数组. 注意对于 \(p_i\) 更新若干个 \(q_i\) 时要从大到小.
#include <bits/stdc++.h> using namespace std; #define inc(x, l, r) for (int x = l; x <= r; x++) #define lowbit(x) (x & (-x)) const int maxn = 1e6 + 5; int n, p[maxn], q[maxn], b[maxn]; int pos[maxn]; void update(int i, int val) { while (i <= n) { b[i] = max(b[i], val); i += lowbit(i); } } int query(int i) { int r = 0; while (i) { r = max(r, b[i]); i -= lowbit(i); } return r; } int main() { cin >> n; inc(i, 1, n) cin >> p[i]; inc(i, 1, n) { cin >> q[i]; pos[q[i]] = i; } inc(i, 1, n) { vector<int> id; inc(j, 1, n / p[i]) id.push_back(pos[p[i] * j]); sort(id.begin(), id.end(), greater<int>()); for (auto e : id) update(e, query(e - 1) + 1); } cout << query(n) << "\n"; }
C - Row Column Sums
显然 \(\sum_{1\leq i\leq h} a[i] \equiv \sum_{1\leq i\leq w} b[i] \pmod k\) 是必要的.
刚开始贪心地给每个格子都填 \(k-1\), 然后算出每一行每一列模 \(k\) 意义下需要减去多少才能满足 \(a[], b[]\) 条件. 设为 \(a[]', b[]'\). 最后只要减去 \(\max(\sum_{1\leq i\leq h} a[i]', \sum_{1\leq i\leq w} b[i]')\) 即可.
描述一下具体减数字的方法. 不妨假设 \(\sum_{1\leq i\leq w} b[i]'\) 更大, 即列的总和. 对于每一列, 我们要减去 \(b[i]'\), 其中 \(b[i]' = (h \times (k - 1) - b[i]) \bmod k\) (行是类似的).
检查当前哪一行还需要减去数字, 就在该行与当前列相交的格子减去1, 如果所有行都不需要再减去数字, 则不妨在第一行与当前列相交的格子减去1. 总共便减去了 \(\sum_{1\leq i\leq w}b[i]'\). 并且除第一行以外的行都不需要再减去数字, 则第一行也满足有关条件(因为行与列减去的数字是一样大的).
#include <bits/stdc++.h> using namespace std; #define inc(x, l, r) for (int x = l; x <= r; x++) #define ll long long int main() { ll h, w, k; cin >> h >> w >> k; vector<ll> a(h), b(w); inc(i, 0, h - 1) cin >> a[i]; inc(i, 0, w - 1) cin >> b[i]; if (accumulate(a.begin(), a.end(), 0LL) % k != accumulate(b.begin(), b.end(), 0LL) % k) { cout << "-1\n"; return 0; } for (ll& e : a) e = (k + w * (k - 1) % k - e) % k; for (ll& e : b) e = (k + h * (k - 1) % k - e) % k; cout << h * w * (k - 1) - max(accumulate(a.begin(), a.end(), 0LL), accumulate(b.begin(), b.end(), 0LL)) << "\n"; }
这篇关于AtCoder Regular Contest 133 题解 A - C的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27TypeScript面试真题解析与实战指南
- 2024-12-27TypeScript大厂面试真题详解与解析
- 2024-12-26怎么使用nsenter命令进入容器?-icode9专业技术文章分享
- 2024-12-26导入文件提示存在乱码,请确定使用的是UTF-8编码怎么解决?-icode9专业技术文章分享
- 2024-12-26csv文件怎么设置编码?-icode9专业技术文章分享
- 2024-12-25TypeScript基础知识详解
- 2024-12-25安卓NDK 是什么?-icode9专业技术文章分享
- 2024-12-25caddy 可以定义日志到 文件吗?-icode9专业技术文章分享
- 2024-12-25wordfence如何设置密码规则?-icode9专业技术文章分享
- 2024-12-25有哪些方法可以实现 DLL 文件路径的管理?-icode9专业技术文章分享