AtCoder Beginner Contest 391

news/2025/2/1 21:47:48/文章来源:https://www.cnblogs.com/maburb/p/18696522

A - Lucky Direction

点击查看代码
void solve() {std::vector<std::string> a{"N","S", "W", "E", "NE", "SW", "NW", "SE"};std::string s;std::cin >> s;int p = std::find(a.begin(), a.end(), s) - a.begin();std::cout << a[p ^ 1] << "\n";
}

B - Seek Grid

点击查看代码
void solve() {int n, m;std::cin >> n >> m;std::vector<std::string> s(n), t(m);for (int i = 0; i < n; ++ i) {std::cin >> s[i];}   for (int i = 0; i < m; ++ i) {std::cin >> t[i];}auto check = [&](int a, int b) -> bool {for (int i = 0; i < m; ++ i) {for (int j = 0; j < m; ++ j) {if (s[a + i][b + j] != t[i][j]) {return false;}}}return true;};for (int i = 0; i + m - 1 < n; ++ i) {for (int j = 0; j + m - 1 < n; ++ j) {if (check(i, j)) {std::cout << i + 1 << " " << j + 1 << "\n";return;}}}
}

C - Pigeonhole Query

题意:\(n\)个鸽子开始各在第\(i\)个笼子里,每次会移动一只鸽子到另一个笼子,或者问你有多少个笼子有两个以上的鸽子。

记录每个笼子的鸽子数和每个鸽子在哪个笼子即可。

点击查看代码
void solve() {int n, q;std::cin >> n >> q;std::vector<int> cnt(n, 1), p(n);std::iota(p.begin(), p.end(), 0);int ans = 0;while (q -- ) {int op;std::cin >> op;if (op == 1) {int x, y;std::cin >> x >> y;-- x, -- y;if (cnt[p[x]] == 2) {-- ans;}-- cnt[p[x]];if (cnt[y] == 1){++ ans;}++ cnt[y];p[x] = y;} else {std::cout << ans << "\n";}}
}

D - Gravity

题意:\(n\)个方块向下落,每一时刻,如果最底层填满了方块,就消除这些方块。然后如果有方块不是在最底层并且下面没有方块就会下落。\(q\)次询问问你第\(t + 0.5\)时刻第\(i\)个方块有没有被消除。

模拟消除即可。每次模拟一行的消除,每次找每行高度最低的方块里高度最高的。最多模拟\(n\)次。

点击查看代码
void solve() {int n, m;std::cin >> n >> m;std::vector<int> ans(n, 2e9);std::vector<std::vector<std::pair<int, int> > > a(m);for (int i = 0; i < n; ++ i) {int x, y;std::cin >> x >> y;-- x;a[x].push_back({y, i});}for (int i = 0; i < m; ++ i) {std::sort(a[i].begin(), a[i].end(), std::greater<>());}int time = 0;auto move = [&]() -> bool {int max = 0;for (int i = 0; i < m; ++ i) {if (a[i].empty()) {return false;}max = std::max({max, a[i].back().first - time, 1});}int t = max - 1;for (int i = 0; i < m; ++ i) {ans[a[i].back().second] = time + t;a[i].pop_back();}time += t;return true;};while (move());int q;std::cin >> q;while (q -- ) {int t, x;std::cin >> t >> x;-- x;if (ans[x] >= t) {std::cout << "Yes\n";} else {std::cout << "No\n";}}
}

E - Hierarchical Majority Vote

题意:一个\(3^n\)长度的字符串\(s\)每次会缩短三倍变成\(s'\),如果\(s_{3i}, s_{3i + 1}, s_{3i + 2}\)里有两个以上的1,\(s'_{i}\)就是1,否则是0。最终会变成一个0或者1,现在要你修改最少的字符使得最终结果改变。

可以用递归求出最终结果,每次分成三份一直递归到长度为1就行。然后得到我们需要变成的结果v(v=0或者v=1),最后依然可以递归求,求出每个部分变成v需要几次操作,取最小的两个部分即可。

点击查看代码
void solve() {int n;std::cin >> n;n = std::pow(3, n);std::string s;std::cin >> s;auto dfs = [&](auto self, int l, int r) -> int {if (l == r) {return s[l - 1] - '0';}int len = (r - l + 1) / 3;return self(self, l, l + len - 1) + self(self, l + len, l + 2 * len - 1) + self(self, l + 2 * len, r) >= 2;};int v = dfs(dfs, 1, n);auto dfs1 = [&](auto self, int l, int r) -> int {if (l == r) {return s[l - 1] - '0' == v;}int len = (r - l + 1) / 3;int a = self(self, l, l + len - 1);int b = self(self, l + len, l + 2 * len - 1);int c = self(self, l + 2 * len, r);std::vector<int> d{a, b, c};std::sort(d.begin(), d.end());return d[0] + d[1];};// std::cout << v << "\n";std::cout << dfs1(dfs1, 1, n) << "\n";
}

F - K-th Largest Triplet

题意:给你三个数组,求所有\(i, j, k\)中,\(a_i b_j + b_j c_k + a_i c_k\)中第\(m\)大的。

三个数组从大到小排序后用优先级队列模拟即可,一开始把\(\{val(1, 1, 1), 1, 1, 1\}\)入队,分别代表\(i,j, k\)得到的值以及\(i, j, k\)的值。注意每个\(i, j, k\)可能被多个状态转移,用set记录一下。

点击查看代码
void solve() {int n, m;std::cin >> n >> m;std::vector<i64> a(n), b(n), c(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}for (int i = 0; i < n; ++ i) {std::cin >> b[i];}for (int i = 0; i < n; ++ i) {std::cin >> c[i];}std::sort(a.begin(), a.end(), std::greater<i64>());std::sort(b.begin(), b.end(), std::greater<i64>());std::sort(c.begin(), c.end(), std::greater<i64>());auto get = [&](int i, int j, int k) -> i64 {return a[i] * b[j] + b[j] * c[k] + a[i] * c[k];};std::priority_queue<std::array<i64, 4>> heap;heap.push({get(0, 0, 0), 0, 0, 0});std::set<std::array<int, 3> > s;s.insert({0, 0, 0});while ( -- m) {auto [val, i, j, k] = heap.top(); heap.pop();if (i + 1 < n && !s.count({i + 1, j, k})) {s.insert({i + 1, j, k});heap.push({get(i + 1, j, k), i + 1, j, k});}if (j + 1 < n && !s.count({i, j + 1, k})) {s.insert({i, j + 1, k});heap.push({get(i, j + 1, k), i, j + 1, k});}if (k + 1 < n && !s.count({i, j, k + 1})) {s.insert({i, j, k + 1});heap.push({get(i, j, k + 1), i, j, k + 1});}}std::cout << heap.top()[0] << "\n";
}

G - Many LCS

待补。

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

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

相关文章

『Python底层原理』--CPython如何编译代码

前一篇我们介绍了CPython VM的运行机制,它基于一系列字节码指令来实现程序逻辑。 不过,Python字节码在完整描述代码功能上存在局限性,于是代码对象应运而生。像模块、函数这类代码块的执行,本质上就是对应代码对象的运行,代码对象涵盖了字节码、常量、变量名以及各类属性信…

MyBatis之jdbc属性外部配置

将jdbc数据库连接属性写在db.properties中,如图 然然后在配置文件中引入

25.2.1小记

Object类Object类中自带的toString和equals函数(默认比较管理者是否管理相同的对象,可以通过对子类函数的重构实现正常比较) // @Override//重写,编译器会默认构造类型检查public boolean equals(Object obj) {//向下造型CD cc = (CD)obj;return artist.equals(cc.artist…

“尝试一下挣钱的辛苦”之装师

我尝试了把我做的兽头卖出去,记录一下从孩子出生到找到妈咪领养的过程 因为没有太多预算,所以兽设没有找画师,我自己构思的;整个制作过程都要用到热熔胶,很容易烫到>_<(热熔胶——手作娘离不开的东西),梳理毛布也很让人头疼,弄得房间里都是毛毛,虽然但是,孩子…

“尝试一下挣钱的辛苦”

我尝试了把我做的兽头卖出去,记录一下从孩子出生到找到妈咪领养的过程 因为没有太多预算,所以兽设没有找画师,我自己构思的;整个制作过程都要用到热熔胶,很容易烫到>_<(热熔胶——手作娘离不开的东西),梳理毛布也很让人头疼,弄得房间里都是毛毛,虽然但是,孩子…

VScode使用插件open-in-browser在默认浏览器中打开html文件

1. vscode extension中搜索open in browser,并下载。 我下载的第一个2. 打开.html文件 alt+shift+b手动选择特定浏览器打开 alt+b用默认浏览器打开,如果没有设置默认浏览器,可能出现以下问题3. 配置默认浏览器 ctrl+shift+p打开command palette 输入settings.json,打开Open…

在MacOS上安装sqllite

参考教程 https://www.runoob.com/sqlite/sqlite-installation.html 1.下载sqllite安装包 https://www.sqlite.org/2025/sqlite-autoconf-3480000.tar.gz wget https://www.sqlite.org/2025/sqlite-autoconf-3480000.tar.gz tar -xvzf sqlite-autoconf-3480000.tar.gz cd sqlit…

【译】MongoDB EF Core 提供程序:有什么新功能?

原文 | Rishit, Luce 翻译 | 郑子铭 这是 Rishit Bhatia 和 Luce Carter 的客座文章。Rishit 是 MongoDB 的高级产品经理,专注于 .NET 开发人员体验,在进入产品管理部门之前,他已经使用 C# 工作多年。Luce 是 MongoDB 的开发倡导者、Microsoft MVP,热爱代码、阳光和学习。本…

06. 文件权限

一、文件属性Linux 系统是一个典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保证系统的安全性,Linux 系统对不同的访问用户访问同一个文件(包括目录文件)的权限做了不同的规定。在 Linux 中,我们可以使用 ll 或者 ls -l 命令来显示一个文件的属性以及…

java中的Hashtable

Hashtable Hashtable 是 Java 中的一个古老的集合类,它实现了 Map 接口,基于哈希表存储键值对。 Hashtable 是线程安全的,所有方法都用 synchronized 修饰,因此在多线程环境下可以安全使用。 不过,由于它的性能较差,现代开发中更推荐使用 HashMap Hashtable中的t是小写,…

[HCTF 2018]admin

打开靶机进入登录界面,账号输入admin,密码随便输入一个密码,使用burp抓包后发送到攻击器将密码设为变量,导入字典,开始攻击发现密码"123"的返回长度不同,使用"123"登录,得到flag