链接:https://atcoder.jp/contests/abc398
A – Doors in the Center
算法:
模拟。
思路:
无。
关键代码:
void miyan()
{
int n;
cin >> n;
if (n & 1)
{
cout << string(n / 2, '-');
cout << '=';
cout << string(n / 2, '-') << endl;
}
else
{
cout << string((n - 1) / 2, '-');
cout << '=';
cout << '=';
cout << string((n - 1) / 2, '-') << endl;
}
}
B – Full House 3
算法:
模拟。
思路:
无。
关键代码:
void miyan()
{
map<int, int> m;
for (int i = 0; i < 7; ++i)
{
int x;
cin >> x;
++m[x];
}
int cnt1 = 0, cnt2 = 0;
for (auto [_, x] : m)
{
if (x >= 3)
++cnt1;
else if (x >= 2)
++cnt2;
}
if (cnt1 >= 2 || (cnt1 && cnt2))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
C – Uniqueness
算法:
模拟。
思路:
无。
关键代码:
void miyan()
{
int n;
cin >> n;
map<int, vector<int>, greater<>> m;
for (int i = 0; i < n; ++i)
{
int x;
cin >> x;
m[x].push_back(i);
}
ll ans = -2;
for (auto [x, v] : m)
{
if (v.size() == 1 && ans == -2)
ans = v.back();
}
cout << ans + 1 << endl;
}
D – Bonfire
算法:
思维,前缀和。
思路:
对于 \(i\),只要存在一个 \(j\) 使得 \(s[i \text{ ~ } j]\) 移动到 \((R, C)\) 点,那么这一时刻 \(s[i] =\) '1'。
将 \(N、W、S、E\) 转换成二元组前缀和,此时就将问题转换为了寻找一段区间其和为 \((R, C)\)。
哈希表 + 前缀和解决即可。
关键代码:
void miyan()
{
int n, x, y;
string s;
cin >> n >> x >> y >> s;
s = ' ' + s;
vector<pii> pre(n, {0, 0});
for (int i = 1; i <= n; ++i)
{
pre[i] = pre[i - 1];
if (s[i] == 'N')
--pre[i].first;
else if (s[i] == 'W')
--pre[i].second;
else if (s[i] == 'S')
++pre[i].first;
else
++pre[i].second;
}
string ans;
map<pii, int> m;
for (int i = 1; i <= n; ++i)
{
++m[pre[i - 1]];
int l = pre[i].first - x;
int r = pre[i].second - y;
if (m.count({l, r}))
ans.push_back('1');
else
ans.push_back('0');
}
cout << ans << endl;
}
E – Tree Game
算法:
交互,二分图。
思路:
不存在奇数环等价于是一个二分图。
最后操作完后,图一定变为一个完全二分图,一个图其完全二分图最大边数 \(= cnt0 * cnt1\),其中 \(cnt0\) 与 \(cnt1\) 为在二分图上两种不同的染色。
那么对于一个图其可操作次数为 \(cnt0 * cnt1 – (n – 1)\),如果可操作奇数条边就选择先手,否者后手,每次输出一个不同染色并且不存在的边。
关键代码:
void miyan()
{
int n;
cin >> n;
vector<vector<int>> g(n + 1);
vector st(n + 1, vector<int>(n + 1, 0));
for (int i = 0; i < n - 1; ++i)
{
int u, v;
cin >> u >> v;
st[u][v] = 1;
st[v][u] = 1;
g[u].push_back(v);
g[v].push_back(u);
}
vector<int> col(n + 1, 0);
auto dfs = [&](auto &&self, int u, int f) -> void
{
for (auto v : g[u])
{
if (v == f)
continue;
col[v] = col[u] ^ 1;
self(self, v, u);
}
};
col[1] = 1;
dfs(dfs, 1, 0);
int cnt1 = accumulate(all(col), 0ll);
int cnt0 = n - cnt1;
int tot = cnt1 * cnt0 - n + 1;
int u, v;
if (tot & 1)
cout << "First" << endl;
else
{
cout << "Second" << endl;
cin >> u >> v;
st[u][v] = 1;
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (i == j)
continue;
if (!st[i][j] && !st[j][i] && col[i] != col[j])
{
cout << i << ' ' << j << endl;
st[i][j] = st[j][i] = 1;
cin >> u >> v;
st[u][v] = st[v][u] = 1;
}
}
}
}
F – ABCBA
算法:
\(manacher\)。
思路:
板子。
关键代码:
vector<int> manacher(string ss)
{
int m = ss.size();
vector<int> p(m, 0);
int c = 0, r = 0;
for (int i = 0; i < m; ++i)
{
int len = r > i ? min(p[2 * c - i], r - i) : 1;
while (i + len < m && i - len >= 0 && ss[i + len] == ss[i - len])
++len;
if (i + len > r)
{
r = i + len;
c = i;
}
p[i] = len;
}
return p;
}
void miyan()
{
string s;
cin >> s;
int n = s.size();
string ss;
ss.push_back('#');
for (int i = 0; i < n; ++i)
{
ss.push_back(s[i]);
ss.push_back('#');
}
auto p = manacher(ss);
int m = p.size();
ll maxx = 1;
for (int i = 0; i < m; ++i)
{
if (i + p[i] == m)
maxx = max(maxx, p[i] - 1ll);
}
cout << s;
for (int i = n - maxx - 1; i >= 0; --i)
cout << s[i];
cout << endl;
}
G – Not Only Tree Game
还没补。










