abc 391 题解

news/2025/3/3 22:14:12/文章来源:https://www.cnblogs.com/Young-Cloud/p/18749502

ABC

D

解题思路

如果对于每个点,我们知道了它被移除的时刻(无限大则说明不会被移除),我们就可以知道询问的点在给定时刻有没有消失。

在对所有的点按横坐标分类后,我们就可以知道最多有多少行点被移除:点数最少的那一列的点数。

对于能够被移除的点,假设它处在 \(x\) 层,则被该点被移除的时刻就是第 \(x\) 层被移除的时刻 \(t[x] = max(t[x - 1] + 1, max_{点 i 在 x 层}Y_i)\)

CODE
void solve()
{int n = 0, w = 0;std::cin >> n >> w;// 按横坐标分类std::vector X(w + 1, std::vector<int>{});// 每个点在第几层std::vector idx(n, 0);for (int i = 0; i < n; i++) {int x = 0, y = 0;std::cin >> x >> y;idx[i] = X[x].size();X[x].push_back(y);}int mn = n;for (int i = 1; i <= w; i++) {mn = std::min(mn, int(X[i].size()));}std::vector lay(mn, 0);for (int i = 1; i <= w; i++) {for (int j = 0; j < mn; j++) {lay[j] = std::max(lay[j], X[i][j]);}}for (int i = 1; i < mn; i++) {lay[i] = std::max(lay[i - 1] + 1, lay[i]);}int q = 0;std::cin >> q;while (q--) {int T = 0, a = 0;std::cin >> T >> a;a--;std::cout << ((idx[a] < mn ? lay[idx[a]] : Inf) > T ? "Yes" : "No") << '\n';}return;
}

E

解题思路

对于长度为 \(3^n\)\(n > 0\))的一段 01 串,如果我们知道了它三个长度为 \(3^{n - 1}\) 的子串的值和改变这个值所要改变的数量,我们就可以知道答案了。递归着去求就好了。

CODE
std::string s;
// 预处理出 3 的幂
std::vector p3(N + 1, 1);// 传入左端点和区间长度的次数
std::pair<int, int> dfs(int l, int n) {// 递归出口if (n == 0) {return { s[l] - '0', 1 };}std::vector son{ dfs(l, n - 1), dfs(l + p3[n - 1], n - 1), dfs(l + 2 * p3[n - 1], n - 1) };std::sort(son.begin(), son.end());int val = 0, cost = 0;if (son[0].first == son[2].first) {val = son[0].first;int sum = 0, mx = 0;for (int i = 0; i < 3; i++) {sum += son[i].second;mx = std::max(mx, son[i].second);}cost = sum - mx;}else {val = son[1].first;if (val == 0) {cost = std::min(son[0].second, son[1].second);}else {cost = std::min(son[1].second, son[2].second);}}return { val, cost };
}void solve()
{int n = 0;std::cin >> n;std::cin >> s;std::cout << dfs(0, n).second << '\n';
}

F

解题思路

先把三个序列都降序排列,定义三元组 \(<i,j,k>\) 的值为 \(V(i, j, k)\),那么我们就知道了最大值是 \(V(0, 0, 0)\)。由于是降序排列,所以有一个很重要的性质:

\[V(i + 1, j, k) \leq V(i, j, k) \And V(i, j + 1, k) \leq V(i, j, k) \And V(i, j, k + 1) \leq V(i, j, k) \]

所以对于第 \(x\) 大的 \(<i, j, k>\),第 \(x + 1\) 大的一定是上面三个中的一个,所以我们就直接优先队列就好了。

下面用了哈希做了三元组和值的互换。

CODE
int n;
std::vector<i64> A(N + 5), B = A, C = A;i64 f(std::array<int, 3> p) {i64 w = 1ll;i64 res = 0;for (int i = 0; i < 3; i++) {res += w * p[i];w *= n;}return res;
}std::array<int, 3> g(i64 val) {std::array<int, 3> res;for (int i = 0; i < 3; i++) {res[i] = val % n;val /= n;}return res;
}std::priority_queue<std::pair<i64, i64>> q;
std::set<i64> vis;void add(std::array<int, 3> p) {i64 hp = f(p);if (p[0] < n && p[1] < n && p[2] < n && vis.count(hp) == 0) {q.push({ A[p[0]] * B[p[1]] + B[p[1]] * C[p[2]] + A[p[0]] * C[p[2]], hp });vis.insert(hp);}
}void solve()
{int k = 0;std::cin >> n >> k;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.begin() + n, std::greater<i64>());std::sort(B.begin(), B.begin() + n, std::greater<i64>());std::sort(C.begin(), C.begin() + n, std::greater<i64>());q.push({ A[0] * B[0] + B[0] * C[0] + C[0] * A[0], 0 });for (int i = 0; i < k; i++) {if (i == k - 1) {std::cout << q.top().first << '\n';break;}auto [x, y, z] = g(q.top().second);q.pop();add({ x + 1, y, z });add({ x, y + 1, z });add({ x, y, z + 1 });}
}

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

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

相关文章

加速PyTorch模型训练技巧

Pytorch-Lightning 可以在Pytorch的库Pytorch-lightning中找到我们在这里讨论的每一个优化。Lightning是在Pytorch之上的一个封装,它可以自动训练,同时让研究人员完全控制关键的模型组件。Lightning使用最新的最佳实践,并将你可能出错的地方最小化。 我们为MINST定义为Light…

能力全面提升综合题单-练习

Part1 语言基础题 P1089 [NOIP 2004 提高组] 津津的储蓄计划import java.util.Scanner;// P1089 [NOIP 2004 提高组] 津津的储蓄计划 public class P1089 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int[] budget = new int[12];for (int …

kettle插件-git/svn版本管理插件

场景:大家都知道我们平时使用spoon客户端的时候时无法直接使用git的,给我们团队协作带来了一些小问题,需要我们本机单独安装git客户端进行手动上传trans或者job。 我们团队成员倪老师开发了一款kettle的git插件,帮我们解决了这个大难题,大大方便了我们团队协作,今天一起来…

自我介绍,软工五问

作业相关信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13325这个作业的目标 学习博客的使用自我介绍 我是软工2班的彭颂华…

HTTPS,TLS原理分析

简单介绍 Tansport Layer Security TLS 已经逐渐取代 SSL 可以简单理解:HTTPS = HTTP + SSL/TLS TLS运行在TCP之上,HTTP之下,传输层协议,负责HTTP内容的安全传输 TLS流程在TCP三次握手建立连接后开始 TLS协议结构wireshark中TLS主要分为两层,底层的是TLS记录协议,主要负责…

训练ai生成代码效果展示

训练ai生成代码效果展示 在本次实验中试图使用命令的形式来训练ai,达到成功获取需要的web开发页码的效果 起初 本来我打算让ai生成一个整体的项目,但是ai不可以直接生成一整块的项目,他也没办法把得到的结果以文件的形式传给你,得到的还是文本,第一实验的结果并不理想 以下是训…

公交线路(迪杰斯特拉)

这道题就是一道迪杰斯特拉的板子,没想到的是我想到了重载小于符号,没想到要定义优先队列 #include<iostream> #include<vector> #include<queue> #include<cstring> using namespace std; const int N=1000+5; struct node{int id,dis; }; vector<…

HDFS中数据目录的挂载在根目录下至磁盘爆满问题解决

1、查看hdfs-size.xml文件 获取数据目录位置vim /opt/hadoop/etc/hadoop/hdfs-site.xml<property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop-data/data-node-data,/home/hadoop-data/data-node-data-2,/data-3</value> </pro…

下载及安装

进入官网https://www.docker.com/ 直接在浏览器下载会比较慢,我习惯复制下载链接后到迅雷去下载,更快一些 双击安装后会有个选项是add....什么什么,意思是添加桌面快捷方式 后有个选项是退出并重启,这个重启是重启电脑(所以截图没有了),记得保存好自己的文档 问卷调查 …

修理牛棚

思路: 有的牛棚住牛,有的是空的,从反过来的思路来想,先用一块木板盖住所有有猪住的猪棚,减去空牛棚数,最终得到最多被木板挡住门的牛棚的数量。 代码展示: #include<bits/stdc++.h> using namespace std; const int N=210; int m,s,c;int a[N],b[N];int main() {c…

写了个 CasaOS/ZimaOS 内网穿透的远程访问插件(不是 frp 或者 nps),欢迎大家测试使用

插件正在提交,应该过几天就会进入市场了。 插件访问效果大概如下: casaOS 远程界面 如果大家想先行测试可以手动下载 pr 的文件进行测试。使用 插件会提供一个二维码,使用OpenIoThub 开源 APP扫码添加插件网关,然后在客户端上添加要访问的主机,然后在主机下面添加端口,然…