链接:https://codeforces.com/contest/2148
A. Sublime Sequence
算法:
模拟。
思路:
无。
关键代码:
void miyan()
{
int x, n;
cin >> x >> n;
if (n & 1)
cout << x << endl;
else
cout << 0 << endl;
}
B. Lasers
算法:
模拟。
思路:
每条线必然都会被穿过。
关键代码:
void miyan()
{
ll n, m, x, y;
cin >> n >> m >> x >> y;
vector<ll> a(n), b(m);
for (auto &x : a)
cin >> x;
for (auto &x : b)
cin >> x;
cout << n + m << endl;
}
C. Pacer
算法:
贪心。
思路:
无。
关键代码:
void miyan()
{
ll n, m;
cin >> n >> m;
vector<pii> a(n + 1);
for (int i = 1; i <= n; ++i)
cin >> a[i].first >> a[i].second;
ll last = 0, op = 0;
ll ans = 0;
for (int i = 1; i <= n; ++i)
{
auto [x, y] = a[i];
ll cnt = x - last;
ll now = (op + cnt) % 2;
ans += cnt;
if (now != y)
--ans;
last = x;
op = y;
}
if (a[n].first != m)
ans += m - a[n].first;
cout << ans << endl;
}
D. Destruction of the Dandelion Fields
算法:
贪心。
思路:
奇数才会切换状态。
先到一个最大的奇数换成启动状态,切掉所有的偶数,然后交替切掉奇数,小奇数关,大奇数开。
关键代码:
void miyan()
{
int n;
cin >> n;
vector<ll> a(n);
for (auto &x : a)
cin >> x;
vector<ll> odd, even;
odd.reserve(n), even.reserve(n);
for (int i = 0; i < n; ++i)
{
if (a[i] & 1)
odd.push_back(a[i]);
else
even.push_back(a[i]);
}
ranges::sort(odd, greater<>());
ranges::sort(even);
if (odd.empty())
cout
<< 0 << endl;
else if (even.size())
{
ll ans = accumulate(all(even), 0ll) + odd.front();
for (int i = 1; i < (odd.size() + 1) / 2; ++i)
ans += odd[i];
cout << ans << endl;
}
else
{
ll ans = 0;
for (int i = 0; i < (odd.size() + 1) / 2; ++i)
ans += odd[i];
cout << ans << endl;
}
}
E. Split
算法:
贪心。
思路:
可以发现如果数组中每个元素的个数都是 \(k\) 的倍数,那么必然就存在卓越子数组。
如果一个子数组中每个元素的个数都小于整体个数 \(/ k\),那么这个子数组就成立。
关键代码:
void miyan()
{
int n, k;
cin >> n >> k;
vector<int> a(n);
for (auto &x : a)
cin >> x;
map<int, int> m;
for (auto x : a)
++m[x];
for (auto &[_, x] : m)
{
if (x % k)
{
cout << 0 << endl;
return;
}
x /= k;
}
ll ans = 0;
map<int, int> cnt;
for (int l = 0, r = 0; r < n; ++r)
{
++cnt[a[r]];
while (cnt[a[r]] > m[a[r]])
--cnt[a[l++]];
ans += r - l + 1;
}
cout << ans << endl;
}
F. Gravity Falls
算法:
模拟,排序,贪心。
思路:
每次将所有数组排序,取开头字典序最小的数组 \(a\) 放到答案里面,然后每个数组都截去前 \(len(a)\) 个元素,循环往复,循环到最后全部数组都为空即可。
关键代码:
void miyan()
{
int n;
cin >> n;
vector<vector<int>> a(n);
ll len = 0;
for (int i = 0; i < n; ++i)
{
ll k;
cin >> k;
a[i].resize(k);
len = max(len, k);
for (int j = 0; j < k; ++j)
cin >> a[i][j];
}
vector<int> ans;
ans.reserve(len);
ll pos = 0;
while (pos < len)
{
ranges::sort(a);
for (int i = 0; i < a[0].size(); ++i)
ans.push_back(a[0][i]);
pos += a[0].size();
ll k = a[0].size();
vector<vector<int>> b;
b.reserve(n);
for (int i = 0; i < n; ++i)
{
if (a[i].size() > k)
{
vector<int> c;
c.reserve(len - k);
for (int j = k; j < a[i].size(); ++j)
c.push_back(a[i][j]);
b.push_back(c);
}
}
a = b;
n = a.size();
}
for (auto x : ans)
cout << x << ' ';
cout << endl;
}
G. Farmer John’s Last Wish
还没补。