AtCoder Beginner Contest 370

news/2025/1/15 16:00:27/文章来源:https://www.cnblogs.com/Lanly/p/18402239

A - Raise Both Hands (abc370 A)

题目大意

给出Snuke举的左右手情况,如果只举左手,输出Yes,如果只举右手,输出No,否则输出Invalid

解题思路

逐一判断即可。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;int main(void) {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int l, r;cin >> l >> r;if (l == 1 && r == 0)cout << "Yes" << '\n';else if (l == 0 && r == 1)cout << "No" << '\n';elsecout << "Invalid" << '\n';return 0;
}


B - Binary Alchemy (abc370 B)

题目大意

给定物品合成成分表\(a_{ij}\)表示物品 \(i\)和物品 \(j\)合成物品 \(a_{ij}\)

问物品 \(1\),依次与 \(1,2,3,..N\)物品合成,问最后的物品。

解题思路

按照题意查表,模拟合成即可。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;int main(void) {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin >> n;vector<vector<int>> a(n);for (int i = 0; i < n; i++) {a[i].resize(i + 1);for (auto& x : a[i]) {cin >> x;--x;}}int cur = 0;for (int i = 0; i < n; ++i) {int x = cur, y = i;if (x < y)swap(x, y);cur = a[x][y];}cout << cur + 1 << '\n';return 0;
}


C - Word Ladder (abc370 C)

题目大意

给定两个字符串\(s,t\)

用最小的次数,使得 \(s=t\),并且字符串\(x\)的字典序最小。

操作为,选择 \(s_i = c\),并且将修改后的 \(s\)放入 \(x\)的末尾。

解题思路

如何次数最小呢?

依次考虑\(s\)从左到右的每一位 \(i\),如果 \(s_i \neq t_i\),那我肯定要 \(s_i = t_i\),但这是我们此时要进行的操作吗?还是先放一放,改后面的字母后,再改当前位?

由于每次会将修改后的\(s\)放入 \(x\)的末尾,因此我们要优先考虑首先进行的操作,应该是:即刻进行,还是缓一缓在进行。

如果\(s_i > t_i\),那就优先更改当前位,这样改后的 \(s\)的字典序更小。

如果 \(s_i < t_i\),那就先更改后面位的,最后再改当前位,这样得到的 \(x\)的字典序最小。

这种回溯的感觉,可以用\(DFS\)实现上述操作。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;int main(void) {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);string s, t;cin >> s >> t;vector<string> ans;auto dfs = [&](auto dfs, int pos) {if (pos == s.size()) {return;}if (s[pos] == t[pos]) {dfs(dfs, pos + 1);} else if (s[pos] < t[pos]) {dfs(dfs, pos + 1);s[pos] = t[pos];ans.push_back(s);} else {s[pos] = t[pos];ans.push_back(s);dfs(dfs, pos + 1);}};dfs(dfs, 0);cout << ans.size() << '\n';for (auto& i : ans)cout << i << '\n';return 0;
}


D - Cross Explosion (abc370 D)

题目大意

二维网格,初始每个格子有墙。

依次进行\(q\)次放炸弹的操作,给定每次放炸弹的位置 \((i,j)\),如果该位置有墙,则该墙消失。

否则,炸弹会爆炸,会产生十字冲击波,该位置上下左右的各第一个墙都会消失。

问最后还存在的墙的数量。

解题思路

对于第一种情况,直接移除该位置的墙即可。

对于第二种情况,需要找到该列上下、该行左右最近的墙。

墙的数量\(hw \leq 4e5\),可以储存每个墙的坐标。

然后对于每行和每列,分别维护\(hset[i]\)表示第\(i\)行还有墙的列坐标,是个\(set\)\(wset[i]\)表示第 \(i\)列还有墙的行坐标 ,也是个\(set\)

这样,对于一个炸弹 \((i,j)\),如果该位置没有墙\((hset[i].find(j) == hset[i].end())\),则需要找到 \(< j\)的最大和 \(> j\) 的最小的数字。同理对于\(wset\)也要找对应的数字,然后 \(erase\)。这样每次操作的复杂度都是 \(O(\log)\),总的时间复杂度就是 \(O(q\log (h + w))\)

代码对于没有墙的逻辑是:

  • \(it = hset[i].lower\_bound(j)\), 由于没有墙,此时一定 \(*it > y\)(否则是 \(*it == y\)),如果 \(it != hset[i].end()\),那么它就是下面的第一个墙(这里认为左上是原点),要毁掉,于是\(it = hset[i].erase(it)\)\(erase\)返回值是移除了该 \(*it\)后的下一个元素。
  • 然后要找上面的第一个墙,此时 \(it\)\(>y\)的第一个位置(无论刚刚是否\(erase\)了),因此如果 \(it != hset[i].begin()\),那么 \(prev(it)\)就是上面的第一个墙,要毁掉,于是 \(hset[i].erase(prev(it))\)

同理的思路处理 \(wset\)即可。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;int main(void) {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int h, w, q;cin >> h >> w >> q;vector<int> hh(h), ww(w);iota(hh.begin(), hh.end(), 0);iota(ww.begin(), ww.end(), 0);vector<set<int>> hset(h), wset(w);for (int i = 0; i < h; i++) {hset[i].insert(ww.begin(), ww.end());}for (int i = 0; i < w; i++) {wset[i].insert(hh.begin(), hh.end());}while (q--) {int x, y;cin >> x >> y;--x, --y;auto it = hset[x].lower_bound(y);if (it != hset[x].end() && *it == y) {hset[x].erase(y);wset[y].erase(x);} else {if (it != hset[x].end()) {wset[*it].erase(x);it = hset[x].erase(it);}if (it != hset[x].begin()) {it = prev(it);wset[*it].erase(x);hset[x].erase(it);}it = wset[y].lower_bound(x);if (it != wset[y].end()) {hset[*it].erase(y);it = wset[y].erase(it);}if (it != wset[y].begin()) {it = prev(it);hset[*it].erase(y);wset[y].erase(it);}}}int cnt = 0;for (int i = 0; i < h; i++) {cnt += hset[i].size();}cout << cnt << '\n';return 0;
}


E - Avoid K Partition (abc370 E)

题目大意

给定一个数组\(a\),划分成若干个子区间,使得没有子区间的和为 \(k\)

求划分方案数。

解题思路

朴素\(dp\)就是设 \(dp[i]\)表示前 \(i\)段划分满足条件的方案数。

转移则枚举最后一次的区间,然后 \(dp[i] = \sum_{1 \leq j \leq n, sum[j+1..i] \neq k} dp[j]\)

复杂度显然是 \(O(n^2)\)的。

棘手在条件 \(sum[j+1..i] \neq k\)上,如果没有这个条件,这个转移其实就是一个前缀和,用前缀和优化即为 \(O(n)\)

我们用前缀和相减代替区间和,即 \(sum[j+1..i] = sum[i] - sum[j]\),转移式即为\(dp[i] = \sum_{1 \leq j \leq n, sum[i] - sum[j] = k} dp[j]\)

换句话说,我们要对\(sum[j] \neq sum[i] - k\)\(dp[j]\)求和,这是个非常稀疏的条件,即如果设 \(cnt[i] = \sum_{sum[j] = i} dp[j]\),即前缀和为 \(i\)\(dp\)值,那上述转移式可改写成\(dp[i] = \sum_{1 \leq j < i} dp[j] - cnt[sum[i] - k]\)

即一个前缀和与一个数的差值,这样转移就是\(O(1)\)了,因此维护一个\(dp\)前缀和 \(\sum_{1 \leq j < i} dp[j]\)以及前缀和的\(dp\)\(cnt[i] = \sum_{sum[j] = i} dp[j]\)即可。

时间复杂度就是\(O(n \log n)\)

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;const int mo = 998244353;int main(void) {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;LL k;cin >> n >> k;vector<int> a(n);for (auto& x : a)cin >> x;map<LL, int> cnt;cnt[0] = 1;LL presum = 0;int precnt = 1;int ans = 0;for (auto& i : a) {presum += i;ans = (precnt - cnt[presum - k] + mo) % mo;cnt[presum] = (cnt[presum] + ans) % mo;precnt = (precnt + ans) % mo;};cout << ans << '\n';return 0;
}


F - Cake Division (abc370 F)

题目大意

给定一个环形数组,划分为\(k\)段,使得每段和的最小值最大。

在该最大值的各种划分方案中,求有多少位置,在所有划分方案中都不被分开。

解题思路

<++>

神奇的代码



G - Divisible by 3 (abc370 G)

题目大意

如果一个数是好的,说明它的因子和能被\(3\)整除。

给定 \(n,m\),问一个长度为 \(m\)的数组 \(a\)的数量,满足其各数的乘积不超过 \(n\),且是好数。

解题思路

<++>

神奇的代码



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/793765.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序授权登录前后端对接及用户信息完善

对接后台登录流程 微信官方早都已经禁止开发者直接通过 api 获取用户信息数据了,大家拿个用户的 openid 注册好,剩下的让用户填写就行了。 先上官方的经典登录流程图:步骤拆分解析:前端通过 调用官方 API wx.login,将回调中的 code 临时登陆凭证传递给(请求)后台 后台去…

Zabbix03 Zabbix自动化运维和性能优化高可性, Zabbix用Grafana图形展示

Zabbix 网络发现 专门有个进程扫描机器,比较耗资源,不太好(除非公司不大,添加的主机不多)Zabbix 自动注册 资源消耗少。agent必须是主动模式Zabbix API 实现自动化运维 先登录获取token,再携带token获取其他资源Zabbix 优化可以查看队列了解 Zabbix 性能状态 #web网页左侧…

第十四讲:答疑文章(一):日志和索引相关问题

第十四讲:答疑文章(一):日志和索引相关问题 简概:​ 到目前为止,我已经收集了 47 个问题,很难通过今天这一篇文章全部展开。所以,我就先从中找了几个联系非常紧密的问题,串了起来,希望可以帮你解决关于日志和索引的一些疑惑。而其他问题,我们就留着后面慢慢展开吧。…

大模型api实战-open.bigmodel.cn

注册登录后在个人中心的API keys中找到并复制推荐使用SDK,在虚拟环境安装 pip install zhipuai编辑python代码访问API获取响应 from zhipuai import ZhipuAI client = ZhipuAI(api_key="0c6df39e71b0a7340f221fddc1ddb711.au66Z02fXWc7SJBB") response = client.cha…

焦煤

这种走势概率大 目前在走3-5的跌势

linux虚拟机(centos)搭建sqli-labs

1.开启小皮2.查看文件位置 配置文件路径为/usr/local/phpstudy/soft [root@localhost soft]# cd /www/admin/localhost_80 [root@localhost soft]# pwd /usr/local/phpstudy/soft网站根目录为/www/admin/localhost_80/wwwroot [root@localhost localhost_80]# cd wwwroot [root…

Zabbix01 Zabbix安装和基础功能

商业监控方案#从各个地区来监测网络情况 http://ping.chinaz.com/ 站长之家 免费 https://www.jiankongbao.com/ 监控宝 ...#云服务自带云监控系统 Zabbix 架构#zabbix web为php程序 如果公司规模小,zabbix server,db和zabbix web装在一台机器上 如果公司规模大,…

【赛后反思】洛谷基础赛 #15 「LAOI」Round 6 考后总结(待补完)

待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完待补完LGR-198-Div.3 考后总结 又要掉分了:展开目录 目录LGR-198-Div.3 考后总结A [太阳]] 请…

Win10电脑网络正常,其他浏览器可以打开网页,但Chrome浏览器打不开网页,开发者工具中看请求未发出,左上角一直转圈圈

问题现象: Win10电脑网络正常,可以ping通baidu.com, qq.com, 域名正常解析。 其他浏览器edge可以打开网页 但Chrome浏览器打不开网页,开发者工具中看请求未发出,左上角一直转圈圈解决办法: 谷歌浏览器右上角,点击三个点按钮-->然后选择设置,高级 --> 系统 -->…

[c++][笔记]浅谈几种排序方式---冒泡排序,选择排序,桶排序

一、algorithm里的sort函数 #include <cstdio> // 数据小的可以用iostream #include <algorithm> // 不能忘记算法库,否则会编译失败。 using namespace std; int main() {int n;scanf("%d", &n);int a[n+5] = {};for (int i = 1; i <= n; i++)…

Java反序列化漏洞-TemplatesImpl利用链分析

目录一、前言二、正文1. 寻找利用链2. 构造POC2.1 生成字节码2.2 加载字节码1)getTransletInstance2)defineTransletClasses2.3 创建实例3. 完整POC三、参考文章 一、前言 java.lang.ClassLoader#defineClassdefineClass可以加载字节码,但由于defineClass的作用域是protecte…

Camunda Modeler流程设计器

1、介绍 任何可执行流程都需要预先设计和配置业务流程模型和BPMN图,BPMN图可以让使用者更容易理解流程的结构,Camunda Modeler是一个可视化设计和实现BPMN图表的工具。 下面是官方使用文档:1、Modeler中绘制BPMN介绍 2、桌面版Modeler使用介绍 2、相关概念 可以将BPMN的绘制…