链接:https://atcoder.jp/contests/abc433
A – Happy Birthday! 4
算法:
模拟。
思路:
无。
关键代码:
void miyan()
{
int x, y, z;
cin >> x >> y >> z;
if (x <= y)
{
cout << "No" << endl;
return;
}
for (int i = 0; i <= 10000; ++i)
{
if (x + i == (y + i) * z)
{
cout << "Yes" << endl;
return;
}
}
cout << "No" << endl;
}
B – Nearest Taller
算法:
模拟。
思路:
无。
关键代码:
void miyan()
{
int n;
cin >> n;
vector<int> a(n);
for (auto &x : a)
cin >> x;
for (int i = 0; i < n; ++i)
{
bool ok = 0;
for (int j = i - 1; j >= 0; --j)
{
if (a[j] > a[i])
{
ok = 1;
cout << j + 1 << endl;
break;
}
}
if (!ok)
cout << -1 << endl;
}
}
C – 1122 Substring 2
算法:
贪心。
思路:
无。
关键代码:
void miyan()
{
string s;
cin >> s;
int n = s.size();
vector<pii> a;
for (int i = 0, j = 0; i < n; ++i)
{
j = i + 1;
while (j < n && s[j] == s[i])
++j;
a.push_back({s[i] - '0', j - i});
i = j - 1;
}
ll ans = 0;
for (int i = 0; i < a.size() - 1; ++i)
{
if (a[i].first + 1 != a[i + 1].first)
continue;
ans += min(a[i].second, a[i + 1].second);
}
cout << ans << endl;
}
D – 183183
算法:
数论。
思路:
\(f(a, b) = a * (10 ^ k) + b, k = b.size()\) \(a * (10 ^ k) + b ≡ 0 (mod m)\) \(b ≡ -a * (10 ^ k) (mod m)\)关键代码:
void miyan()
{
ll n, m;
cin >> n >> m;
vector<ll> a(n);
for (auto &x : a)
cin >> x;
vector<ll> pow(15, 1);
for (int i = 1; i <= 10; ++i)
pow[i] = (pow[i - 1] * 10) % m;
map<int, vector<ll>> hash;
for (int i = 0; i < n; ++i)
{
int len = to_string(a[i]).size();
hash[len].push_back(a[i] % m);
}
for (auto &[cnt, vec] : hash)
ranges::sort(vec);
ll ans = 0;
for (int i = 0; i < n; ++i)
{
for (int k = 1; k <= 10; ++k)
{
ll cur = a[i] % m * pow[k] % m;
cur = (-cur + m) % m;
int L = ranges::lower_bound(hash[k], cur) - hash[k].begin();
int R = ranges::upper_bound(hash[k], cur) - hash[k].begin();
if (R > L)
ans += R - L;
}
}
cout << ans << endl;
}
E – Max Matrix 2
算法:
构造。
思路:
如果在 \(x\) 中存在重复元素答案为 \(No\),\(y\) 同理。
维护集合 \(set\) 为未在 \(x\),\(y\) 中出现的数字。
令 \(val = min(x[i], y[j]):\)
- 如果 \(val\) 既存在于 \(x\) 中,还存在于 \(y\) 中,那么 a[i][j] = val[/latex]
- 如果 \(val\) 存在于 \(x\) 中,但不存在于 \(y\) 中,说明 \(x[i] < y[j]\),\(val\) 还未被使用的话,可以直接令 \(a[i][j] = val\)
- 如果 \(val\) 存在于 \(y\) 中,但不存在于 \(x\) 中,说明 \(x[i] > y[j]\),\(val\) 还未被使用的话,可以直接令 \(a[i][j] = val\)
- 如果 \(val\) 已经被使用了,那么需要填一个小于 \(val\) 的数字 \(x\),在 \(set\) 中贪心选一个最大的 \(x\) 即可。
关键代码:
void miyan()
{
int n, m;
cin >> n >> m;
vector<int> x(n + 1), y(m + 1);
for (int i = 1; i <= n; ++i)
cin >> x[i];
for (int i = 1; i <= m; ++i)
cin >> y[i];
vector<int> st(n * m + 1, 0);
for (int i = 1; i <= n; ++i)
{
if (st[x[i]])
{
cout << "No" << endl;
return;
}
st[x[i]] = 1;
}
ranges::fill(st, 0);
for (int i = 1; i <= m; ++i)
{
if (st[y[i]])
{
cout << "No" << endl;
return;
}
st[y[i]] = 1;
}
set<int> s;
for (int i = 1; i <= n * m; ++i)
s.insert(i);
for (int i = 1; i <= n; ++i)
s.erase(x[i]);
for (int i = 1; i <= m; ++i)
s.erase(y[i]);
vector ans(n + 1, vector<int>(m + 1, 0));
set<int> used;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
int val = min(x[i], y[j]);
if (x[i] == y[j])
{
if (used.count(val))
{
cout << "No" << endl;
return;
}
ans[i][j] = val;
used.insert(val);
}
}
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
int val = min(x[i], y[j]);
if (x[i] != y[j])
{
if (!used.count(val))
{
ans[i][j] = val;
used.insert(val);
}
else
{
auto it = s.upper_bound(val);
if (it == s.begin())
{
cout << "No" << endl;
return;
}
int num = *prev(it);
ans[i][j] = num;
used.insert(num);
s.erase(num);
}
}
}
}
cout << "Yes" << endl;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
cout << ans[i][j] << ' ';
cout << endl;
}
}
F – 1122 Subsequence 2
还没补。










