AtCoder Beginner Contest 347

1|0A - Divisible


#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<i64>; using pii = pair<int, int>; using piii = tuple<int, int, int>; const int inf = 1e18; i32 main() { ios::sync_with_stdio(false), cin.tie(nullptr); int n , k; cin >> n >> k; for( int i = 1 , x ; i <= n ; i ++ ){ cin >> x; if( x % k == 0 ) cout << x / k << " "; } return 0; }

2|0B - Substring


#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<i64>; using pii = pair<int, int>; using piii = tuple<int, int, int>; const int inf = 1e18; i32 main() { ios::sync_with_stdio(false), cin.tie(nullptr); string s; cin >> s; set<string> cnt; for (int i = 0; i < s.size(); i++) for (int j = 1; i + j <= s.size(); j++) cnt.insert(s.substr(i, j)); cout << cnt.size() << "\n"; return 0; }

3|0C - Ideal Holidays


首先要做一个取模,然后枚举取模后所有的点做起点,判断能不能把所有的工作都安排在假期。

#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<i64>; using pii = pair<int, int>; using piii = tuple<int, int, int>; const int inf = 1e18; i32 main() { ios::sync_with_stdio(false), cin.tie(nullptr); int n, a, b; cin >> n >> a >> b; b += a; vi d(n); for (auto &i: d) { cin >> i, i = (i - 1) % b; } set<int> c; for (auto i: d) c.insert(i); if( c.size() == 1 ){ cout << "Yes\n"; return 0; } while (true) { int x = *c.begin(); if (x >= b) break; c.erase(c.begin()); if (*c.rbegin() < x + a) { cout << "Yes\n"; return 0; } c.insert(x + b); } cout << "No\n"; return 0; }

4|0D - Popcount and XOR


首先我们统计出popcpunt(C)=t。然后我们X,Y异或能得到的数的一的数量的范围是[abs(XY),X+Y],判断t是否在这个范围内。

然后我们设抵消的一的个数有x个,则题目可知$a + b - 2*x = t a + b + t = 2t - 2 * x a+b+t\frac{a + b + 2 }{ 2} = t - x $,根据题目可知0a+b+t260恒成立。

然后我们算出x的值,开始一位位的遍历C即可,每一位的值如果是0,就可以给两个两个数这一位赋值为 1,如果是 1 就可以跟任意一个数赋值为 1.

#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<i64>; using pii = pair<int, int>; using piii = tuple<int, int, int>; using node = bitset<60>; const int N = (1ll << 60); i32 main() { int a, b, c; cin >> a >> b >> c; node C(c); int t = C.count(); if (a + b < t or t < abs(a - b) or (a + b + t) % 2 != 0 or (a + b + t) / 2 > 60) { cout << "-1\n"; return 0; } t = (a + b - t) / 2, a -= t, b -= t; int x = 0, y = 0; for (int i = 59; i >= 0; i--) { x <<= 1, y <<= 1; if (C[i]) { if (a > 0) x |= 1, a--; else if (b > 0) y |= 1, b--; } else { if (t > 0) x |= 1, y |= 1, t--; } } cout << x << " " << y << "\n"; return 0; }

5|0E - Set Add Query


set模拟出这个集合,并把第i次操作后set的大小记为sum[i],并且统计出每个数字操作的位置。

对于每个数字,实际上就是奇数次操作到偶数次操作中间的部分,这一部分可以用前缀和快速求出来。

#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<i64>; using pii = pair<int, int>; using piii = tuple<int, int, int>; const int inf = 1e18; i32 main() { int n, q; cin >> n >> q; vector<vi> op(n + 1); vi sum(q + 1); set<int> s; for (int i = 1, x; i <= q; i++) { cin >> x; if (s.count(x)) s.erase(x); else s.insert(x); sum[i] = sum[i - 1] + s.size(); op[x].push_back(i); } for (auto &it: op) if (it.size() % 2 == 1) it.push_back(q + 1); for (int i = 1, ans; i <= n; i++) { ans = 0; for (int j = 1; j < op[i].size(); j += 2) ans += sum[op[i][j] - 1] - sum[op[i][j - 1] - 1]; cout << ans << " "; } return 0; }

__EOF__

本文作者PHarr
本文链接https://www.cnblogs.com/PHarr/p/18133203.html
关于博主:前OIer,SMUer
版权声明CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
posted @   PHarr  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示