Atcoder Beginner Contest 354
A - Exponential Plant
#include <bits/stdc++.h> using namespace std; using i64 = long long; int main() { ios::sync_with_stdio(false), cin.tie(nullptr); int N; cin >> N; int ans = 0; int cnt = 0; while (ans <= N) { ans += 1 << cnt; cnt++; } cout << cnt << "\n"; return 0; }
B - AtCoder Janken 2
本来想开
#include <bits/stdc++.h> using namespace std; using i64 = long long; int main() { ios::sync_with_stdio(false), cin.tie(nullptr); int N, ans = 0; cin >> N; vector<string> s(N); for (int i = 0; i < N; i++) { cin >> s[i]; int c; cin >> c; ans += c; } ans %= N; sort(s.begin(), s.end()); cout << s[ans] << "\n"; return 0; }
C - AtCoder Magics
暴力思路:将牌按
时间复杂度为
#include <bits/stdc++.h> using namespace std; using i64 = long long; const int N = 2e5 + 10; struct point { int a, c, order; }p[N]; bool cmp(const point& x, const point& y) { return x.a < y.a; } int main() { ios::sync_with_stdio(false), cin.tie(nullptr); int n; cin >> n; for (int i = 0; i < n; i++) { cin >> p[i].a >> p[i].c; p[i].order = i + 1; } sort(p, p + n, cmp); for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (p[i].c > p[j].c) { p[i].order = 0; break; } } } int ans = 0; vector<int> t; for (int i = 0; i < n; i++) { if (p[i].order) { ans++; t.push_back(p[i].order); } } cout << ans << "\n"; sort(t.begin(), t.end()); for (auto i : t) cout << i << " "; return 0; }
优化:由于是对当前每张牌
#include <bits/stdc++.h> using namespace std; using i64 = long long; const int N = 2e5 + 10; struct point { int a, c, order; }p[N]; bool cmp(const point& x, const point& y) { return x.a < y.a; } int main() { ios::sync_with_stdio(false), cin.tie(nullptr); int n; cin >> n; for (int i = 0; i < n; i++) { cin >> p[i].a >> p[i].c; p[i].order = i + 1; } sort(p, p + n, cmp); int minn = p[n - 1].c; for (int i = n - 1; i >= 0; i--) { if (p[i].c > minn) { p[i].order = 0; } else { minn = p[i].c; } } int ans = 0; vector<int> t; for (int i = 0; i < n; i++) { if (p[i].order) { ans++; t.push_back(p[i].order); } } cout << ans << "\n"; sort(t.begin(), t.end()); for (auto i : t) cout << i << " "; return 0; }
更简洁的写法:
#include <bits/stdc++.h> using i64 = long long; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int N; std::cin >> N; std::vector<int> A(N), C(N); for (int i = 0; i < N; i++) { std::cin >> A[i] >> C[i]; } std::vector<int> p(N); std::iota(p.begin(), p.end(), 0); std::sort(p.begin(), p.end(), [&](int i, int j) { return A[i] > A[j]; }); int min = 1E9 + 1; std::vector<int> ans; for (auto i : p) { if (C[i] < min) { min = C[i]; ans.push_back(i + 1); } } std::sort(ans.begin(), ans.end()); std::cout << ans.size() << "\n"; for (int i = 0; i < ans.size(); i++) { std::cout << ans[i] << " \n"[i == ans.size() - 1]; } return 0; }
D - AtCoder Wallpaper
经过观察可发现整个图形是由无数个
构成的,对于该基本图形用数组表示其每个单元面积的二倍,然后循环看以
横向的循环节为
#include <bits/stdc++.h> using namespace std; using i64 = long long; constexpr int v[4][2] = {{2, 1}, {1, 2}, {0, 1}, {1, 0}}; i64 solve(int n, int m) { i64 ans = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; j++) { ans += 1LL * v[i][j] * ((n - i + 3) >> 2) * ((m - j + 1) >> 1); } } return ans; } int main() { ios::sync_with_stdio(false), cin.tie(nullptr); int A, B, C, D; cin >> A >> B >> C >> D; i64 ans = solve(C, D) - solve(C, B) - solve(A, D) + solve(A, B); cout << ans; return 0; }
本文作者:胖柚の工作室
本文链接:https://www.cnblogs.com/pangyou3s/p/18224286
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步