AtCoder Beginner Contest 371(ABCDE)

news/2024/9/30 18:05:53

A
个人直接硬解,讨论情况也并不复杂
代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
void solve() {char a, b, c;cin >> a >> b >> c;if (a == '<') {if (c == '<') {cout << "B" << endl;return;} else {if (b == '<') {cout << "C" << endl;return;} else {cout << "A" << endl;return;}}} else {if (c == '>') {cout << "B" << endl;return;} else {if (b == '<') {cout << "A" << endl;return;} else {cout << "C" << endl;return;}}}
}
signed main() {ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//    int t;
//    cin >> t;
//    while (t--)solve();return 0;
}

B
只要一旦找到每个家庭的太郎,标记一下就行了
代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
bool vt[N];
void solve() {int n, m;cin >> n >> m;while (m--) {int a;char c;cin >> a >> c;if (!vt[a]) {if (c == 'M') {cout << "Yes" << endl;vt[a] = 1;} else {cout << "No" << endl;}} else cout << "No" << endl;}
}
signed main() {ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//    int t;
//    cin >> t;
//    while (t--)solve();return 0;
}

C
同构见的不是很多,但该题数据很小,点最多才8个,第一眼的思路是对第二个图的点进行全排列,然后再与图一比较,计算删边和加边的总价值,然后对每个全排列的总价值取最小就是最终答案,代码细节比较多。
如果数据范围较大,确实有必要思考一下怎么做。
代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=10;
int w[N][N];//加边或删边的权值
int a[N];//全排列
bool p1[N][N],p2[N][N];//分别为图一图二的边
bool vis[N][N];//用于标记,避免重复加边或删边
void solve() {int n, m;cin >> n >> m;for (int i = 1; i <= m; i++) {int u, v;cin >> u >> v;p1[u][v] = 1, p1[v][u] = 1;//反向也记录}int M;cin >> M;for (int i = 1; i <= M; i++) {int u, v;cin >> u >> v;p2[u][v] = 1, p2[v][u] = 1;}for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {cin >> w[i][j];w[j][i] = w[i][j];}}for (int i = 1; i <= n; i++) {a[i] = i;}int ans1 = 1e16;do {memset(vis, 0, sizeof vis);int ans = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if ((!vis[a[i]][a[j]] && !vis[a[j]][a[i]]) &&((p1[i][j] && !p2[a[i]][a[j]]) || (!p1[i][j] && p2[a[i]][a[j]]))) {ans += w[a[i]][a[j]];vis[a[i]][a[j]] = vis[a[j]][a[i]] = 1;//标记该边已经被处理}}}ans1 = min(ans, ans1);} while (next_permutation(a + 1, a + n + 1));//全排列函数cout << ans1 << endl;
}
signed main() {ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//    int t;
//    cin >> t;
//    while (t--)solve();return 0;
}

D
D题相当模板,查询区间的和,直接上线段树,但该题是以坐标的形式,所有首先是要将坐标的范围转变为下标的区间,以便线段树区间查询。对于左端点,二分去找第一个≥该坐标的下标就是区间左端点;
对于右端点二分去找第一个大于该坐标的下标再减一就是区间右端点;
代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
#define lc p<<1
#define rc (p<<1)|1
const int N=2e5+10;
int x[N],b[N];
struct Tree {int l, r, sum;
}tr[N*4];void pushup(int p) { //上传tr[p].sum = tr[lc].sum + tr[rc].sum;
}void build(int p,int l,int r) { //建树tr[p] = {l, r, b[l]};if (l == r) return;int m = l + r >> 1;build(lc, l, m);build(rc, m + 1, r);pushup(p);
}int query(int p,int x,int y) { //区间查询if (x <= tr[p].l && y >= tr[p].r) { //覆盖则返回return tr[p].sum;}int m = tr[p].l + tr[p].r >> 1; //不覆盖裂开
//    pushdown(p);int sum = 0;if (x <= m) sum += query(lc, x, y);if (y > m) sum += query(rc, x, y);return sum;
}void solve() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> x[i];}for (int i = 1; i <= n; i++) cin >> b[i];build(1, 1, n);int q;cin >> q;while (q--) {int l, r;cin >> l >> r;int l1 = lower_bound(x + 1, x + n + 1, l) - x;int r1 = upper_bound(x + 1, x + n + 1, r) - x - 1;if (r1 < l1) cout << 0 << endl;else cout << query(1, l1, r1) << endl;}
}
signed main() {ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//    int t;
//    cin >> t;
//    while (t--)solve();return 0;
}

E
对于每一个值a[i],包含它的区间的个数是(n - j + 1) * j ,也就是它的贡献。但是,有相同的数,所以造成的贡献就不一样,要取相同的俩个值中间的部分作为贡献

像这样每个元素对应的贡献是这样的俩段区间长度的乘积,图中的贡献就是 i*(n - i + 1) + (j - i) * (n - j + 1) + (k - j) * (n - k + 1)
所以将每种值的元素的所有下标放到一个数组中,然后加上每种值的元素的贡献就能得出答案

#include<bits/stdc++.h>
#define int long long
using namespace std;const int N=2e5+10;
int a[N];
vector<int> p[N];//p[i]存放值为i所有的元素所在的下标
void solve() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];p[a[i]].push_back(i);}int ans = 0;for (int i = 1; i <= n; i++) {//每种不同值的元素int cnt = 0;for (auto j: p[i]) {//所在下标ans += (n - j + 1) * (j - cnt);cnt = j;}}cout << ans << endl;
}
signed main() {ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//    int t;
//    cin >> t;
//    while (t--)solve();return 0;
}

总结:
C>D, E题很巧妙,用不上数据结构

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

python 敏感词识别处理

定义词库 1、敏感词库(black_word.txt) 2、jeiba 分词库(jieba_db_file.txt) (我这简单的就用文本来记录了,可以将这些词库都通过数据库来存储,对企业来说通过可视化页面去增删改可能会更方便运营处理)代码示例 import os import jiebablack_word_list = list()def load_word…

刷题系统重构--添加vip功能

c端系统往往都具有vip功能作为主要盈利点,那咱们的刷题微服务系统肯定也该有,但是系统设计的时候就没有vip系统,今天构思了一下把原有代码重构了一下, 首先,根据原料的题目表建一张vip题目表,可以用来只存储vip题目,或者01区分vip题目,重构了一下新增题目,加了一项添加…

Windows 中的硬链接、目录联接(软链接)、符号链接、快捷方式

在Linux文件系统中经常提及硬链接(Hard Link)和符号链接(Symbolic Link),Windows中也可以创建链接,但由于丰富的图形界面操作,很少提及链接。Windows 的 NTFS 文件系统支持三种链接:硬链接(Hard Link)、符号链接(Symbolic Link)和目录链接(junction point),此外还有一个大…

ehviewer绿色版1.9.5.2最新2024ios苹果安卓

随着科技的不断发展,手机已经成为我们生活中不可或缺的一部分。在这个数字化时代,人们对于娱乐方式的需求也在逐渐改变。其中,漫画作为一种受欢迎的阅读形式,已经从传统的纸质书籍转变为数字版。而今天,我要为大家介绍的这款软件——ehviewer绿色版1.9.5.2,正是为了满足广…

建筑中的文化表达与地方特色:演绎地域之魂

在浩瀚的城市风貌中,每一座建筑都是文化的载体,无声地讲述着地域的故事与精神。建筑不仅需要满足功能需求,更应成为文化传承与创新的舞台。本文旨在深度剖析建筑设计如何在尊重与弘扬地方文化的基础上,巧妙融合现代元素,创造出既有时代感又不失根源性的建筑作品。 1. 深入…

确保 PbootCMS 网站能够正常运行,并且成功安装和授权模板

准备 PHP 环境确认 PHP 版本使用命令行或 SSH 登录服务器,运行以下命令检查 PHP 版本:shphp -v确认版本为 5.3+。上传 PbootCMS 文件使用 FTP 客户端使用 FTP 客户端(如 FileZilla、WinSCP 等)连接到服务器。 将 PbootCMS 的所有文件上传到服务器的根目录(通常是 public_h…

解决 PbootCMS 网站程序提示“执行 SQL 发生错误

步骤一:清理缓存文件打开 FTP 客户端使用常用的 FTP 客户端(如 FileZilla、WinSCP 等)连接到服务器。找到 runtime 文件夹在 FTP 客户端中找到 PbootCMS 的安装目录,通常是在 public_html 或 www 目录下。删除 runtime 文件夹中的内容进入 runtime 文件夹,删除其中的所有文…

有效地解决 PbootCMS 网站程序提示“执行 SQL 发生错误!错误:DISK I/O ERROR”的问题,并确保系统的稳定运行

打开 FTP 客户端使用 FTP 客户端连接到服务器。找到 runtime 文件夹在 FTP 客户端中找到 PbootCMS 的安装目录,例如: /var/www/html/pbootcms删除 runtime 文件夹中的内容进入 runtime 文件夹,删除其中的所有文件和子文件夹。升级程序备份现有数据使用 FTP 客户端备份整个网…