AtCoder Beginner Contest 174
AtCoder Beginner Contest 174
A
直接判断 \(x\) 是否 \(\ge 30\)
#include <bits/stdc++.h>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int x;
std::cin >> x;
std::cout << (x >= 30 ? "Yes" : "No") << '\n';
return 0;
}
B
给你一个 \(n\) 个点,问你有多少个点到原点的距离 \(\ge D\)。
遍历判断一下即可
#include <bits/stdc++.h>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, d;
std::cin >> n >> d;
int ans = 0;
for (int i = 1; i <= n; i++) {
int x, y;
std::cin >> x >> y;
ans += (1LL * x * x + 1LL * y * y <= 1LL * d * d);
}
std::cout << ans << '\n';
return 0;
}
C
给你一个 \(k\),和一个无穷的 \(7\) 数列:\(7,77,777,...,\)
问你在这个数列中,第一个是 \(k\) 的倍数的数是第几项?
我们观察每次相当于 \(v=(v*10+7)\% k\),如果做完之后发现 \(v\) 已经在之前出现过,了由于取模的性质,显然会重复之前出现的东西,故我们想到周期性,最多遍历 \(k\) 次就可以知道是否存在答案。
#include <bits/stdc++.h>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int k;
std::cin >> k;
std::vector<bool> st(k, false);
std::string ans;
int v = 0, sz = 0;
while (!st[v]) {
st[v] = true;
sz++;
v = (v * 10 + 7) % k;
if (!v) {
std::cout << sz << '\n';
return 0;
}
}
std::cout << -1 << '\n';
return 0;
}
E
经典的求最大值最小,二分答案
注意二分边界 \(l=1\),\(r=\max_{i=1}^na_i\)
#include <bits/stdc++.h>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, k;
std::cin >> n >> k;
std::vector<int> a(n);
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
auto check = [&](int x) {
int m = k;
for (int i = 0; i < n; i++) {
if (a[i] <= x) continue;
int v = a[i] / x;
if (m < v) {
return false;
}
m -= v;
}
return true;
};
int l = 1, r = *std::max_element(a.begin(), a.end());
while (l < r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
std::cout << l << '\n';
return 0;
}
F
给你 \(Q\) 次询问,每次询问区间 \([l,r]\) 有多少种不同的颜色。
经典题,离线做法很多:莫队,扫描线都可以
这里直接用离线扫描线,扫右端点,维护到当前右端点的所有 \(l\) 的答案,每次用树状数组增加\([pre[a[i]]+1,i]\) 之间的答案。
#include <bits/stdc++.h>
const int N = 5e5 + 10;
int bit[N];
void update(int x, int k) {
for (int i = x; i < N; i += i & -i) {
bit[i] += k;
}
}
int ask(int x) {
int res = 0;
for (int i = x; i; i -= i & -i) {
res += bit[i];
}
return res;
}
int c[N], pre[N], ans[N];
std::vector<std::array<int, 2>> g[N];
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, q;
std::cin >> n >> q;
for (int i = 1; i <= n; i++) {
std::cin >> c[i];
}
for (int i = 1; i <= q; i++) {
int l, r;
std::cin >> l >> r;
g[r].push_back({l, i});
}
for (int r = 1; r <= n; r++) {
update(pre[c[r]] + 1, 1);
update(r + 1, -1);
for (auto& it : g[r]) {
ans[it[1]] = ask(it[0]);
}
pre[c[r]] = r;
}
for (int i = 1; i <= q; i++) {
std::cout << ans[i] << '\n';
}
return 0;
}