AtCoder Beginner Contest 355 A~F

A.Who Ate the Cake?(思维)

题意

已知有三个嫌疑人,有两个证人,每个证人可以指出其中一个嫌疑人不是罪犯,如果可以排除两个嫌疑人来确定犯人,输出犯人的身份,如果无法确定,输出"-1"

分析

如果输入两个人的编号相同,则无法确定犯人,如果不同,则 6 − A − B 6 - A - B 6AB为犯人的编号。

代码

#include <bits/stdc++.h>
using namespace std;void solve() {int a, b;cin >> a >> b;if (a == b) cout << -1 << endl;else cout << 6 - a - b << endl;
}
int main () {solve();return 0;
}

B.Piano 2(桶数组)

题意

给出一个包含 n n n个数字的数组 A A A以及一个包含 m m m个数字的数组 B B B,将 A A A数组和 B B B数组中的数字放入数组 C C C中,并对放入的数字进行排序。

问:数组 C C C中是否存在相邻两项,这两项均属于数组 A A A(保证数组 A A A和数组 B B B中所有数字均是独立的,即不会出现相同的数字)。

分析

使用标记数组对出现在 A A A数组中的数字进行标记,然后将数组 A A A和数组 B B B中元素放入vector中并排序。

然后依次检查vector中相邻两项是否均被标记,如果均被标记,输出Yes,如果结束循环还是没找到,输出No

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5 + 5e2;int n, m,a[N], b[N], vis[N];
vector<int> C;void solve() {cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> a[i];C.emplace_back(a[i]);vis[a[i]] = 1;}for (int i = 1; i <= m; i++) {cin >> b[i];C.emplace_back(b[i]);}sort(C.begin(), C.end());for (int i = 1; i < n + m; i++) {if (vis[C[i - 1]] == 1 && vis[C[i]] == 1) {cout << "Yes" << endl;return;}}cout << "No" << endl;
}
int main () {solve();return 0;
}

C.Bingo 2(模拟)

题意

给出一个 N × N N \times N N×N的网格,将对这个网格执行 T T T个回合操作,每个回合会选择网格上的一个点(使用一个数字代表坐标)进行标记。

当满足以下几种条件之一,即获得了胜利:

  • 存在某一行上所有的格子均被标记

  • 存在某一列上所有的格子均被标记

  • 两条对角线上所有的格子均被标记

问:最早执行多少个回合后,就赢下了这场比赛,如果结束所有操作后还未获胜,输出-1.

分析

为了便于处理,将输入的数字 A i A_i Ai先减去 1 1 1,然后通过 A i / n , A i A_i / n, A_i Ai/n,Ai % n n n的方式即可得到行号和列号(此时的行号和列号从 0 0 0开始)。

然后考虑三个条件怎么进行判断:

  • 行和列:使用数组记录每行每列被标记的节点数量

  • 主对角线:主对角线元素行号和列号均相等,判断当前网格的行号和列号,如果相同即进行标记

  • 副对角线:副对角线的行列号之和为 n − 1 n - 1 n1,判断当前网格的行列号之和是否为 n − 1 n - 1 n1,如果是就进行标记

每轮标记完成后,判断是否满足以上三个条件,如果满足则输出当前轮次,并结束程序。

如果循环正常结束,输出-1

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5e2;int n, k, r[N], c[N], d[5], a[N];void solve() {cin >> n >> k;for (int i = 1; i <= k; i++) {cin >> a[i];a[i]--;int row = a[i] / n, colum = a[i] % n;r[row]++;c[colum]++;if (row == colum) d[0]++;if (row + colum == n - 1) d[1]++;if (r[row] == n || c[colum] == n || d[0] == n || d[1] == n) {cout << i << endl;return;}}cout << -1 << endl;
}
int main () {solve();return 0;
}

D.Intersecting Intervals(双指针)

题意

给出 N N N个区间 [ l i , r i ] [l_i, r_i] [li,ri],问存在多少对区间相交。

分析

考虑相交比较困难,但考虑不相交就很容易了。

不难想到,只要是右边界小于当前区间的左边界的所有区间,那么必然不会与当前区间相交,此时不在乎这个区间的左边界到底是多少,因此,可以使用两个数字存储左右边界,并单独对两个数组排序。

然后从小往大遍历左边界数组,使用双指针在右边界数组中维护所有小于当前左边界的数量,这个数量就是不会与当前区间相交的区间数量。

使用区间总对数减去每个区间不会相交的区间数量即可。

hint: 本题 n n n较大,需要使用long long类型存储答案。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5e2;int l[N], r[N]; void solve() {ll n;cin >> n;for (int i = 0; i < n; i++) {cin >> l[i] >> r[i];}sort(l, l + n);sort(r, r + n);int j = 0;ll ans = (n - 1) * n / 2;for (int i = 0; i < n; i++) {while (r[j] < l[i]) {j++;}ans -= j;}cout << ans << endl;
}
int main () {solve();return 0;
}

E.Guess the Sum(BFS)

题意

本题是一个交互题

给出一个数字 N N N和区间 l , r l, r l,r,题目隐藏了一个数组 A = ( A 0 , A 1 , … , A 2 n − 1 A = (A_0, A_1, \ldots, A_{2^{n} - 1} A=(A0,A1,,A2n1,你的目标是知道 ( A l + A l + 1 + … + A r ) (A_l + A_{l + 1} + \ldots + A_{r}) (Al+Al+1++Ar) % 100 100 100的结果。

你可以按以下要求进行询问:

  • 选择两个非负整数 i , j i, j i,j,需要保证 2 i ( j + 1 ) ≤ 2 N 2^{i}(j + 1) \le 2^{N} 2i(j+1)2N,然后取 L = 2 i j , R = 2 i ( j + 1 ) − 1 L = 2^{i}j, R = 2^{i}(j + 1) - 1 L=2ij,R=2i(j+1)1,将 i , j i, j i,j告诉题目后,题目会返回 ( A L + A L + 1 + … + A R ) (A_L + A_{L + 1} + \ldots + A_{R}) (AL+AL+1++AR) % 100 100 100的结果

你需要在保证询问次数最小的情况下,找到要求的答案。

分析

由于可以通过查询大区间减去小区间的方式获得结果,因此直接通过倍增的方式进行查找不能保证操作次数最少。

例:当要查询的区间为 2 k ∼ 2 k + 1 − 2 2^{k} \sim 2^{k + 1} - 2 2k2k+12时,通过查询区间 2 k ∼ 2 k + 1 − 1 2^{k} \sim 2^{k + 1} - 1 2k2k+11减去区间 2 k + 1 − 1 ∼ 2 k + 1 − 1 2^{k + 1} - 1 \sim 2^{k + 1} - 1 2k+112k+11的方式只需要两次询问,而直接使用倍增进行询问所需的次数无法保证两次询问即查询完整个区间数字总和。

因此,可以将本题中所有可能的询问包含的两个点之间建双向边,那么问题就被转化为了 L ∼ R + 1 L \sim R + 1 LR+1之间的最短路(这里为什么取 R + 1 R + 1 R+1呢?因为当移动到 R + 1 R + 1 R+1时,才能保证第 R R R个元素也被计算到了),使用 B F S BFS BFS搜索最短路,然后通过记录的移动步数反推出最短路径,将最短路径上经过的所有路径上的连接的点作为询问,即可获得最后的答案。

hint: 注意最优走法并不一定都是从左往右走的,可能通过先向右走一大步再回头的方式完成,对于往回走的询问,需要从结果中减去。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5e2;
int ask(int i, int j) {int sign = 1;if (i > j) {swap(i, j);sign *= -1;}int l = log2(j - i), r = i >> l;cout << "? " << l << ' ' << r << endl;cout.flush();int ans;cin >> ans;return sign * ans;
}
int n, l, r, dist[N];
vector<int> G[N];queue<int> Q;
void bfs(int start) {Q.push(start);dist[start] = 1;while (!Q.empty()) {int u = Q.front();Q.pop();for (auto v : G[u]) {if (dist[v] == 0) {dist[v] = dist[u] + 1;Q.push(v);}}}
}void solve() {cin >> n >> l >> r;r++;for (int i = 0; i <= n; i++) {for (int j = 0; j < (1 << n); j += (1 << i)) {G[j].push_back(j + (1 << i));G[j + (1 << i)].push_back(j);}}bfs(l);int ans = 0;while (r != l) {for (auto v : G[r]) {if (dist[r] == dist[v] + 1) {ans = (ans + ask(v, r) + 100) % 100;r = v;break;}}}cout << "! " << ans << endl;
}int main () {solve();return 0;
}

F.MST Query(并查集)

题意

给出一个包含 N N N个点和 N − 1 N - 1 N1条边的带权无向连通图,你将对这个图进行 Q Q Q次操作,每次的操作如下:

  • 给出三个数字 u i , v i , w i u_i, v_i, w_i ui,vi,wi,在点 u i u_i ui v i v_i vi之间连一条边权为 w i w_i wi的边。

  • 计算当前图上的最小生成树权值

分析

由于图上边权的范围很小 ( w i ≤ 10 ) (w_i \le 10) (wi10),因此,可以维护权值为 1 ∼ 10 1 \sim 10 110 10 10 10张图,每张图上边权相等。

将每次加边操作视为往对应边权(以及更高的边权)的图上建边,如果建边之前该图上这两个点不属于同一个集合,那么当前边建立后,最小生成树的权值就会减少,减少多少呢?就得看最低多少权值,对应的图上这两个点才属于同一个集合。

从当前权值开始遍历到 10 10 10,执行到第一个连通的权值对应的图后,即可从维护的权值中减去这个遍历到的权值,然后加上当前建边的权值,即得到了最新的最小生成树权值。

hint: 每次建边时,需要在所有权值大于等于当前边权的图中建边。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5e2;int n, q, f[15][N];int find(int w, int x) {return f[w][x] == x ? x : f[w][x] = find(w, f[w][x]);
}int merge(int u, int v, int w) {int fu = find(w, u),fv = find(w, v);if (fu == fv) return 1;f[w][fu] = fv;return 0;
}void solve() {cin >> n >> q;for (int i = 1; i <= n; i++) {for (int j = 0; j <= 10; j++) {f[j][i] = i;}}int sum = 0;for (int i = 1; i < n; i++) {int u, v, w;cin >> u >> v >> w;for (int j = w; j <= 10; j++) {merge(u, v, j);}sum += w;}while (q--) {int u, v, w;cin >> u >> v >> w;sum += w;for (int j = w; j <= 10; j++) {if (merge(u, v, j)) {sum -= j;break;}}cout << sum << endl;}
}int main () {solve();return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

springboot + Vue前后端项目(第十一记)

项目实战第十一记 1.写在前面2. 文件上传和下载后端2.1 数据库编写2.2 工具类CodeGenerator生成代码2.2.1 FileController2.2.2 application.yml2.2.3 拦截器InterceptorConfig 放行 3 文件上传和下载前端3.1 File.vue页面编写3.2 路由配置3.3 Aside.vue 最终效果图总结写在最后…

TabAttention:基于表格数据的条件注意力学习

文章目录 TabAttention: Learning Attention Conditionally on Tabular Data摘要方法实验结果 TabAttention: Learning Attention Conditionally on Tabular Data 摘要 医疗数据分析通常结合成像数据和表格数据处理&#xff0c;使用机器学习算法。尽管先前的研究探讨了注意力…

Hudi 多表摄取工具 HoodieMultiTableStreamer 配置方法与示例

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

vue3添加收藏网站页面

结构与样式 <template><div class"web_view"><ul><li v-for"web in webList" :key"web.title"><a :href"web.src" :title"web.title" target"_blank"><img :src"web.img&…

微信小程序基础 -- 小程序UI组件(5)

小程序UI组件 1.小程序UI组件概述 开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/view/component.html 什么是组件&#xff1a; 组件是视图层的基本组成单元。 组件自带一些功能与微信风格一致的样式。 一个组件通常包括 开始标签 和 结…

Cyber Weekly #8

赛博新闻 1、微软召开年度发布会Microsoft Build 2024 本周&#xff08;5.22&#xff09;微软召开了年度发布会&#xff0c;Microsoft Build 2024&#xff0c;发布了包括大杀器 Copilot Studio 在内的 50 项更新。主要包括&#xff1a; 硬件层面&#xff1a;与英伟达 & A…

3D牙科网格分割使用基于语义的特征学习与图变换器

文章目录 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer摘要方法实验结果 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer 摘要 本文提出了一种新颖的基于语义的牙科网格分割方…

民国漫画杂志《时代漫画》第16期.PDF

时代漫画16.PDF: https://url03.ctfile.com/f/1779803-1248612470-6a05f0?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

【C++】二分查找:在排序数组中查找元素的第一个和最后一个位置

1.题目 难点&#xff1a;要求时间复杂度度为O(logn)。 2.算法思路 需要找到左边界和右边界就可以解决问题。 题目中的数组具有“二段性”&#xff0c;所以可以通过二分查找的思想进行解题。 代码&#xff1a; class Solution { public:vector<int> searchRange(vect…

Camunda BPM主要组件

Camunda BPM是使用java开发的,核心流程引擎运行在JVM里,纯java库,不依赖其他库或者底层操作系统。可以完美地与其他java框架融合,比如Spring。除了核心流程引擎外,还提供了一系列的管理,操作和监控工具。 1,工作流引擎 既适用于服务或者微服务编排,也适用于人工任务管…

Leetcode42题:接雨水

1.题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

【C语言】二叉树的实现

文章目录 前言⭐一、二叉树的定义&#x1f6b2;二、创建二叉树&#x1f3a1;三、二叉树的销毁&#x1f389;四、遍历二叉树1. 前序遍历2. 中序遍历3. 后序遍历4. 层序遍历 &#x1f332;五、二叉树的计算1. 计算二叉树结点个数2. 计算二叉树叶子结点的个数3. 计算二叉树的深度4…

一、Elasticsearch介绍与部署

目录 一、什么是Elasticsearch 二、安装Elasticsearch 三、配置es 四、启动es 1、下载安装elasticsearch的插件head 2、在浏览器&#xff0c;加载扩展程序 3、运行扩展程序 4、输入es地址就可以了 五、Elasticsearch 创建、查看、删除索引、创建、查看、修改、删除文档…

【MySQL】——并发控制

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

计算机毕业设计 | springboot+vue房屋租赁管理系统(附源码)

1&#xff0c;绪论 1.1 课题来源 随着社会的不断发展以及大家生活水平的提高&#xff0c;越来越多的年轻人选择在大城市发展。在大城市发展就意味着要在外面有一处安身的地方。在租房的过程中&#xff0c;大家也面临着各种各样的问题&#xff0c;比如需要费时费力去现场看房&…

Aws EC2 + Aws Cli + Terraform

1 什么是 Terraform&#xff1f; Terraform 是由 HashiCorp 创建的“基础架构即代码”(Infrastructure-as-Code&#xff0c;IaC)开源工具。Terraform 的配置语言是 HashiCorp Configuration Language&#xff08;HCL&#xff09;&#xff0c;用来替代更加冗长的 JSON 和 XML 等…

SpringBoot注解--09--idea创建spring boot项目,java版本只能选择17和21

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 idea创建spring boot项目1.问题描述2.原因3.解决方法方案一&#xff1a;升级JDK版本至17或更高方案二&#xff1a;替换Spring初始化的源https://start.aliyun.com i…

实时计算及异构计算随笔笔记

3、异构计算的典型应用 异构计算并不神秘&#xff0c;目前已渗透各个领域&#xff0c;不仅是PC领域&#xff0c;也包括了手持移动设备领域、行业领域&#xff0c;甚至是云计算、分布式计算领域。事实上&#xff0c;异构计算至少在应用端&#xff08;前台&#xff09;并不像它的…

ES的安装以及配置+ik分词

环境&#xff1a;windows10、ES&#xff08;8.13.3&#xff09;、Kibana&#xff08;8.13.3&#xff09;、Logstash&#xff08;8.13.3&#xff09;、ik&#xff08;8.13.3&#xff09; 1.下载安装ES Download Elasticsearch | ElasticDownload Elasticsearch or the complet…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试5月26日预测第2弹

今天继续基于8883的大底进行测试&#xff0c;昨天的预测已成功命中&#xff01;今天继续测试&#xff0c;按照排三前面的规律&#xff0c;感觉要出对子了&#xff0c;所以本次预测不再杀对子&#xff0c;将采用杀一个和尾来代替。好了&#xff0c;直接上结果吧~ 首先&#xff0…