链接:https://atcoder.jp/contests/abc419
A – AtCoder Language
算法:
模拟。
思路:
无。
关键代码:
void solve()
{
string s;
cin >> s;
if (s == "red")
cout << "SSS" << endl;
else if (s == "blue")
cout << "FFF" << endl;
else if (s == "green")
cout << "MMM" << endl;
else
cout << "Unknown" << endl;
}
B – Get Min
算法:
堆。
思路:
无。
关键代码:
void solve()
{
int Q;
cin >> Q;
priority_queue<int, vector<int>, greater<int>> q;
while (Q--)
{
int op, x;
cin >> op;
if (op == 1)
{
cin >> x;
q.push(x);
}
else
{
cout << q.top() << endl;
q.pop();
}
}
}
C – King’s Summit
算法:
模拟。
思路:
每个人的移动都是一个八连通,所有两点之间最短路径距离为:
\(\max\left( |x_{1} – x_{2}| , |y_{1} – y_{2}| \right)\)
只需求出所有人的最大最小 x,y 轴坐标,然后两个人同时移动,所有答案为:
\(\left\lceil \frac{\max(\text{maxx} – \text{minx},\; \text{maxy} – \text{miny})}{2} \right\rceil\)
关键代码:
void solve()
{
int n;
cin >> n;
vector<int> x(n), y(n);
for (int i = 0; i < n; ++i)
cin >> x[i] >> y[i];
ll maxx = ranges::max(x);
ll minx = ranges::min(x);
ll maxy = ranges::max(y);
ll miny = ranges::min(y);
cout << (max(maxx - minx, maxy - miny) + 1) / 2 << endl;
}
D – Substr Swap
算法:
差分。
思路:
可以发现每个点只有交换奇数次才会真正的交换,差分维护即可。
关键代码:
void solve()
{
int n, m;
string s, t;
cin >> n >> m >> s >> t;
s = ' ' + s;
t = ' ' + t;
vector<ll> b(n + 10, 0);
while (m--)
{
int l, r;
cin >> l >> r;
++b[l], --b[r + 1];
}
for (int i = 1; i <= n; ++i)
{
b[i] += b[i - 1];
if (b[i] % 2)
cout << t[i];
else
cout << s[i];
}
cout << endl;
}
E – Subarray Sum Divisibility
还没补。