当前位置: 首页 > news >正文

Atcoder Beginner Contest 406

比赛链接:ABC406

A - Not Acceptable

将小时转换成分钟直接进行判断。

时间复杂度: O ( 1 ) O(1) O(1)

#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);int a, b, c, d;cin >> a >> b >> c >> d;if (a * 60 + b >= c * 60 + d) cout << "Yes" << endl;else cout << "No" << endl;return 0;
}

B - Product Calculator

根据题意进行模拟,为了避免 overflow 可以使用 __int128_t 来储存计算机当前展示的值。

时间复杂度: O ( N + K ) O(N + K) O(N+K)

#include <bits/stdc++.h>
using namespace std;#define int long longconst int N = 105;
int n, k, a[N];signed main() {ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);cin >> n >> k;for (int i = 1; i <= n; i++) cin >> a[i];__int128_t now = 1;int inf = 0;for (int i = 1; i <= k; i++) inf = inf * 10 + 9;for (int i = 1; i <= n; i++) {if (now > inf / a[i]) now = 1;else now *= a[i];}string ans;while (now) ans.push_back('0' + now % 10), now /= 10;for (int i = ans.size() - 1; i >= 0; i--) cout << ans[i];cout << endl;return 0;
}

C - ~

  • 根据题目条件可知,要找的波浪形的子数组,一定先增大在减小最后再增大。
  • 我们只需要找到一个连续递减部分,再在这个连续递减的部分两侧加上至少一个数就能构造出满足题目条件的子数组。
  • 每一个连续递减部分能构成的满足题目条件的子数组的数量为这个部分 前面连续递增的长度 × \times × 后面连续递增的长度。
  • 因此,只需要找到原数组每个连续递增部分的长度,答案即为所有两个相邻的连续递增部分的长度的乘积的和。

时间复杂度: O ( N ) O(N) O(N)

#include <bits/stdc++.h>
using namespace std;using ll = long long;
const int N = 3e5 + 5;
int n, p[N], cnt[N];int main() {ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);cin >> n;for (int i = 1; i <= n; i++) cin >> p[i];int num = 1;for (int i = 2; i <= n; i++) {if (p[i] > p[i - 1]) cnt[num]++;else if (cnt[num]) num++;}ll ans = 0;for (int i = 1; i <= num; i++) ans += 1LL * cnt[i - 1] * cnt[i];cout << ans << endl;return 0;
}

D - Garbage Removal

对于每一个行、列分别用一个 set 维护这一行中的点的纵、横坐标,每次查询完将对应的点的坐标从 set 中删除。

时间复杂度: O ( ∑ i = 1 Q T log ⁡ N + N log ⁡ N ) O(\sum_{i = 1}^Q T\log N + N\log N) O(i=1QTlogN+NlogN),其中 T T T 是每次需要删除的点的数量,并且 ∑ i = 1 Q T log ⁡ N ≤ N log ⁡ N \sum_{i = 1}^Q T\log N \le N\log N i=1QTlogNNlogN

#include <bits/stdc++.h>
using namespace std;const int N = 2e5 + 10;
int h, w, n, q;
set<int> row[N], col[N];int main() {ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);cin >> h >> w >> n;for (int i = 1; i <= n; i++) {int x, y;cin >> x >> y;row[x].insert(y), col[y].insert(x);}cin >> q;while (q--) {int op, idx;cin >> op >> idx;if (op == 1) {cout << row[idx].size() << "\n";for (int i : row[idx]) col[i].erase(idx);row[idx].clear();}if (op == 2) {cout << col[idx].size() << "\n";for (int i : col[idx]) row[i].erase(idx);col[idx].clear();}}return 0;
}

E - Popcount Sum 3

从高位往低位考虑,总共放置 k k k 1 1 1,利用 d f s dfs dfs 找出答案,具体实现看代码。

时间复杂度: O ( ∑ i = 1 T i log ⁡ N ) O(\sum_{i = 1}^Ti\log N) O(i=1TilogN)

从高位往地位进行搜索,

  • 如果每一位都放 1 1 1,最多进行 log ⁡ N \log N logN s u m sum sum 就会大于 N N N
  • 如果前面都不放 1 1 1,最多进行 log ⁡ N − K \log N - K logNK 次就会被剪枝。
#include <bits/stdc++.h>
using namespace std;#define int long longconst int mod = 998244353;
int n, k, c[65][65];// 预处理组合数
void init() {c[0][0] = 1;for (int i = 1; i <= 60; i++) {c[i][0] = c[i][i] = 1;for (int j = 1; j < i; j++)c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;}
}// cur 是当前位置,sum 是当前的和,cnt 是剩余要放置的 1 的数量
int dfs(int cur, int sum, int cnt) {	// 不合法条件:sum 大于 n,剩余位置无法放下需要放置的 1if (sum > n || cnt > cur + 1) return 0;// 所有 1 都放完了,sum 就是要加上的答案if (cnt == 0) return sum % mod;// 剩余的 cnt 个 1 可以放在 0 - p 任意一个位置if (sum + (1LL << (cur + 1)) - 1 <= n) {int oup = ((1LL << (cur + 1)) - 1) % mod * c[cur][cnt - 1] % mod;oup = (oup + c[cur + 1][cnt] * (sum % mod) % mod) % mod;return oup;}return (dfs(cur - 1, sum, cnt) + dfs(cur - 1, sum + (1LL << cur), cnt - 1)) % mod;
}void solve() {cin >> n >> k;cout << dfs(59, 0, k) << "\n";
}signed main() {ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);init();int T;cin >> T;while (T--) solve();return 0;
}

相关文章:

  • 【基于Spring Boot 的图书购买系统】深度讲解 用户注册的前后端交互,Mapper操作MySQL数据库进行用户持久化
  • 程序代码篇---数据包解析
  • 层次原理图
  • Android开发——原生渲染方案实现 PDF 预览功能
  • Elasticsearch 初步认识
  • C++控制结构详解:if-else、switch、循环(for/while/do-while)
  • MySQL事务的一些奇奇怪怪知识
  • React-Query使用react-testing-library进行测试
  • 【RabbitMQ】 RabbitMQ高级特性(二)
  • Python高级特性深度解析:从熟练到精通的跃迁之路
  • 【老马】离线版金融敏感信息加解密组件开源项目 encryption-local
  • 实战设计模式之状态模式
  • React 19中useContext不需要Provider了。
  • numpy数组的拆分和组合
  • Python 装饰器详解
  • 使用 C# 入门深度学习:线性代数详细讲解
  • 3:OpenCV—视频播放
  • MySQL--day2--基本的select语句
  • Ubuntu16.04升级gcc/g++版本方法
  • [特殊字符] SSL/TLS 中的密钥协商流程笔记
  • 《习近平新时代中国特色社会主义思想学习论丛》第十一辑至第十五辑出版发行
  • 石家庄桥西区通报“中药液”添加安眠药问题:对医院立案调查
  • 多图|多款先进预警机亮相雷达展,专家:中国预警机已达世界先进水平
  • 价格周报|本周猪价继续下探,机构预计今年猪价中枢有支撑
  • 中欧互动中的合作与分歧:务实需求将克服泛安全化的“政治钟摆”
  • 俄方代表团抵达土耳其,俄乌直接谈判有望于当地时间上午重启