title: 2025-02-23-Atcoder abc394
tags: 算法练习
Atcoder abc394
A
code
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin >> s;
int n = s.size();
for(int i = 0; i < n; i++){
if(s[i] == '2'){
cout << 2 ;
}
}
return 0;
}
B
code
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
vector<string> s(n);
for(int i = 0; i < n; i++){
cin >> s[i];
}
vector<pair<string,int>> a;
for(int i = 0; i < n; i++){
a.pushback(makepair(s[i],s[i].size()));
}
sort(a.begin(), a.end(), [](pair<string, int> x, pair<string, int> y)
{ return x.**second** < y.**second**; });
for(int i = 0; i < n; i++){
cout << a[i].**first**;
}
return 0;
}
C
Debug
code
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
vector<char> chars(s.begin(), s.end());
bool changed = true;
while (changed)
{
changed = false;
vector<char> next = chars;
for (int i = 0; i < chars.size() - 1; i++)
{
if (next[i] == 'W' && next[i + 1] == 'A')
{
next[i] = 'A';
next[i + 1] = 'C';
changed = true;
i++;
}
}
chars = next;
}
for (char c : chars)
{
cout << c;
}
cout << endl;
return 0;
}
D
code
#include <bits/stdc++.h>
using namespace std;
int bracketmatch(string &s1, string &s2)
{
if (s1 == "(" && s2 == ")")
{
return 1;
}
else if (s1 == "[" && s2 == "]")
{
return 1;
}
else if (s1 == "{" && s2 == "}")
{
return 1;
}
return 0;
}
int main()
{
string bracket;
cin >> bracket;
stack<string> bracketstack;
for (int i = 0; i < bracket.size(); i++)
{
string current(1, bracket[i]);
if (current == "(" || current == "[" || current == "{")
{
bracketstack.push(current);
}
else if (current == ")" || current == "]" || current == "}")
{
if (bracketstack.empty())
{
cout << "No" << endl;
return 0;
}
if (bracketmatch(bracketstack.top(), current))
{
bracketstack.pop();
}
else
{
cout << "No" << endl;
return 0;
}
}
}
if (!bracketstack.empty())
{
cout << "No" << endl;
}
else
{
cout << "Yes" << endl;
}
return 0;
}
E
code
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
using namespace std;
int inf = 1000000010;
int main()
{
int n;
cin >> n;
vector<vector<char>> c(n, vector<char>(n));
rep(i, n) rep(j, n) cin >> c[i][j];
vector<vector<int>> a(n, vector<int>(n, inf));
queue<pair<int, int>> que;
rep(i, n)
{
que.push({i, i});
a[i][i] = 0;
}
rep(i, n) rep(j, n)
{
if (i == j or c[i][j] == '-')
continue;
que.push({i, j});
a[i][j] = 1;
}
while (!que.empty())
{
auto q = que.front();
que.pop();
int i = q.**first**, j = q.**second**;
rep(k, n) rep(l, n)
{
if (c[k][i] != '-' && c[j][l] != '-' && c[k][i] == c[j][l] && a[k][l] == inf)
{
a[k][l] = a[i][j] + 2;
que.push({k, l});
}
}
}
rep(i, n)
{
rep(j, n)
{
cout << (a[i][j] == inf ? -1 : a[i][j]) << " \n"[j == n - 1];
}
}
}
F
Alkane
code
#include <bits/stdc++.h>
using namespace std;
#define mp makepair
#define pb pushback
#define fi first
#define se second
#define li long long
#define pii pair<int, int>
#define vi vector<int>
#define forn(i, n) for (int i = 0; i < (int)n; i++)
#define fore(i, b, e) for (int i = (int)b; i <= (int)e; i++)
#define all(x) (x).begin(), (x).end()
int ans = 0;
vector<vi> edges;
vi f;
void dfs(int v, int p)
{
for (int u : edges[v])
{
if (u != p)
{
dfs(u, v);
}
}
f[v] = 1;
if (edges[v].size() >= 4)
{
vi children;
for (int u : edges[v])
{
if (u != p)
{
children.pb(f[u]);
}
else
{
children.pb(1);
}
}
sort(all(children), greater<int>());
forn(j, 3)
{
f[v] += children[j];
}
int here = 1;
forn(j, 4)
{
here += children[j];
}
ans = max(ans, here);
}
else if (p == -1)
{
for (int u : edges[v])
{
f[v] = max(f[v], f[u] + 1);
}
}
ans = max(ans, f[v] + (p == -1 ? 0 : 1));
}
int main()
{
int n;
cin >> n;
edges.resize(n + 1);
forn(i, n - 1)
{
int u, v;
cin >> u >> v;
edges[u].pb(v);
edges[v].pb(u);
}
f.resize(n + 1);
dfs(1, -1);
if (ans < 5)
{
ans = -1;
}
cout << ans;
}
G
Dense Buildings
code
#include <bits/stdc++.h>
#include <atcoder/dsu>
using namespace std;
using namespace atcoder;
#define H 500
#define W 500
#define Q (int)2e+5
#define F (int)1e+6
int main(void)
{
int h, w, q;
int f[H][W];
int a[Q], b[Q], y[Q];
int c[Q], d[Q], z[Q];
int l[Q], r[Q];
vector<pair<int, int>> e[F + 1];
vector<int> check[F + 1];
cin >> h >> w;
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
cin >> f[i][j];
cin >> q;
for (int i = 0; i < q; i++)
{
cin >> a[i] >> b[i] >> y[i] >> c[i] >> d[i] >> z[i];
a[i]--, b[i]--, c[i]--, d[i]--;
}
for (int i = 0; i < h - 1; i++)
for (int j = 0; j < w; j++)
e[min(f[i][j], f[i + 1][j])].pushback({i * w + j, (i + 1) * w + j});
for (int i = 0; i < h; i++)
for (int j = 0; j < w - 1; j++)
e[min(f[i][j], f[i][j + 1])].pushback({i * w + j, i * w + (j + 1)});
for (int i = 0; i < q; i++)
l[i] = 1, r[i] = F + 1;
while (true)
{
bool flag = true;
for (int i = 0; i <= F; i++)
check[i].clear();
for (int i = 0; i < q; i++)
{
if (r[i] - l[i] > 1)
{
check[(l[i] + r[i]) / 2].pushback(i);
flag = false;
}
}
if (flag) break;
dsu uf(h * w);
for (int i = F; i >= 0; i--)
{
int sz = e[i].size();
for (int j = 0; j < sz; j++)
uf.merge(e[i][j].**first**, e[i][j].**second**);
sz = check[i].size();
for (int j = 0; j < sz; j++)
{
int idxs = a[check[i][j]] * w + b[check[i][j]];
int idxt = c[check[i][j]] * w + d[check[i][j]];
if (uf.same(idxs, idxt))
l[check[i][j]] = i;
else
r[check[i][j]] = i;
}
}
}
for (int i = 0; i < q; i++)
cout << (y[i] + z[i] - 2 * min(l[i], min(y[i], z[i]))) << endl;
return 0;
}