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;
}
posted @ 2024-04-12 00:05  jackle  阅读(2)  评论(0编辑  收藏  举报