A. Triple Four
模拟
代码实现
n = int(input())
a = list(map(int, input().split()))
ans = any(a[i] == a[i+1] == a[i+2] for i in range(n-2))
print('Yes' if ans else 'No')
B. Card Pile
模拟
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
int main() {
int q;
cin >> q;
vector<int> st(100, 0);
rep(qi, q) {
int type;
cin >> type;
if (type == 1) {
int x;
cin >> x;
st.push_back(x);
}
else {
int ans = st.back();
st.pop_back();
cout << ans << '\n';
}
}
return 0;
}
C. Buy Balls
先对 \(B\) 和 \(W\) 做降序排序
答案就是 \(B\) 的当前前缀和 + \(W\) 的当前最大前缀和取最大值即可
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
int main() {
int n, m;
cin >> n >> m;
vector<int> b(n), w(m);
rep(i, n) cin >> b[i];
rep(i, m) cin >> w[i];
ranges::sort(b, greater<>());
ranges::sort(w, greater<>());
ll ans = 0;
ll sumb = 0;
ll maxw = 0, sumw = 0;
rep(i, n) {
sumb += b[i];
if (i < m) sumw += w[i];
maxw = max(maxw, sumw);
ans = max(ans, sumb+maxw);
}
cout << ans << '\n';
return 0;
}
D. Minimum XOR Path
爆搜
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
int main() {
int n, m;
cin >> n >> m;
vector<vector<pair<int, ll>>> g(n);
rep(i, m) {
int a, b; ll w;
cin >> a >> b >> w;
--a; --b;
g[a].emplace_back(b, w);
g[b].emplace_back(a, w);
}
ll ans = 1ll<<60;
auto dfs = [&](auto& f, int v, int used=0, ll x=0) -> void {
used |= 1<<v;
if (v == n-1) {
ans = min(ans, x);
return;
}
for (auto [u, w] : g[v]) {
if (used>>u&1) continue;
f(f, u, used, x^w);
}
};
dfs(dfs, 0);
cout << ans << '\n';
return 0;
}
E. Min of Restricted Sum
按位处理
对每个连通分量也是单独处理
对于每个连通分量而言,有两种对称的填数方案,当然也可能这两种填数方案存在矛盾。
对于两种填数方案,显然取填 \(1\) 的个数少的那种方案更优
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using P = pair<int, int>;
int main() {
int n, m;
cin >> n >> m;
vector<vector<P>> g(n);
rep(i, m) {
int a, b, c;
cin >> a >> b >> c;
--a; --b;
g[a].emplace_back(b, c);
g[b].emplace_back(a, c);
}
bool ok = true;
vector<int> ans(n);
rep(k, 30) {
vector<int> col(n, -1);
rep(sv, n) if (col[sv] == -1) {
vector<vector<int>> vs(2);
auto dfs = [&](auto& f, int v, int c=0) -> void {
if (col[v] != -1) {
if (col[v] != c) ok = false;
return;
}
col[v] = c;
vs[c].push_back(v);
for (auto [u, z] : g[v]) {
f(f, u, c^(z>>k&1));
}
};
dfs(dfs, sv);
if (vs[0].size() < vs[1].size()) swap(vs[0], vs[1]);
for (int v : vs[1]) ans[v] |= 1<<k;
}
}
if (!ok) {
puts("-1");
return 0;
}
rep(i, n) cout << ans[i] << " \n"[i == n-1];
return 0;
}
F. Rotated Inversions
考虑二元组 \((i, j)\) 的逆序对的贡献
第 \(i\) 个数从 \(M-1\) 变成 \(0\) 时,左侧会增加 \(i-1\) 个逆序对,右侧则会减少 \(n-i\) 个逆序对,每次只更新当前会发生变化的部分的贡献即可
代码实现
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;
int main() {
int n, m;
cin >> n >> m;
vector<P> p;
rep(i, n) {
int a;
cin >> a;
p.emplace_back(a, i);
}
ranges::sort(p);
ll now = 0;
fenwick_tree<int> t(n);
rep(i, n) {
int j = p[i].second;
now += t.sum(j, n);
t.add(j, 1);
}
for (int x = m-1; x >= 0; --x) {
cout << now << '\n';
while (p.size() and p.back().first == x) {
int j = p.back().second;
p.pop_back();
now += j; now -= n-1-j;
}
}
return 0;
}
G. Flip Row or Col
原题:CF662C
不知道为啥官解做法不是异或卷积
浙公网安备 33010602011771号