VP Codeforces Round 905 (Div. 2)

news/2025/3/3 22:45:24/文章来源:https://www.cnblogs.com/maburb/p/18749566

A. Chemistry

题意:一个字符串,能不能删除不超过\(k\)字符和重排后是回文。

记录每个字符的数量,如果是奇数则我们可能需要删除,最多留一个不能删的放在中间。

点击查看代码
void solve() {int n, k;std::cin >> n >> k;std::string s;std::cin >> s;std::vector<int> cnt(26);for (auto & c : s) {++ cnt[c - 'a'];}int tot = 0;for (int i = 0; i < 26; ++ i) {tot += cnt[i] & 1;}if (k - tot >= -1) {std::cout << "YES\n";} else {std::cout << "NO\n";}
}

B. Raspberries

题意:给你一个数组,每次可以给一个数加一,使得这些数的乘积是\(k\)的倍数,问最少加几次。\(k \in [2, 5]\)

发现除了\(k\)等于\(4\)的时候,都是质数,只需要求每个数变成\(k\)的倍数需要加的最小值。如果是\(4\),则还要看选两个数变成\(2\)的倍数需要加多少。

点击查看代码
void solve() {int n, k;std::cin >> n >> k;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}int ans = 1e9;for (int i = 0; i < n; ++ i) {ans = std::min(ans, (a[i] + k - 1) / k * k - a[i]);}if (k == 4) {int min1 = 1e9, min2 = 1e9;for (int i = 0; i < n; ++ i) {int x = (a[i] + 1) / 2 * 2 - a[i];if (x < min1) {min2 = min1;min1 = x;} else if (x < min2) {min2 = x;}}std::cout << std::min(ans, min1 + min2) << "\n";} else {std::cout << ans << "\n";}
}

C. You Are So Beautiful

题意:求数组有多少子数组在所有子序列里只出现过一次。

预处理每个数前面有没有出现过,和在后面有没有出现过。那么所选的子数组的第一个数和最后一个数在前后各自不能出现。从前往后枚举右端点,如果右端点合法则加上前面合法的左端点的个数。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::vector<int> pre(n), suf(n);std::set<int> s;for (int i = 0; i < n; ++ i) {if (s.count(a[i])) {pre[i] = 1;}s.insert(a[i]);}s.clear();for (int i = n - 1; i >= 0; -- i) {if (s.count(a[i])) {suf[i] = 1;}s.insert(a[i]);}i64 ans = 1;int sum = 0;for (int i = 0; i < n; ++ i) {sum += !pre[i];if (!suf[i]) {ans += i == n - 1 ? sum - 1 : sum;}}std::cout << ans << "\n";
}

D1. Dances (Easy version) && D2. Dances (Hard Version)

题意:给你两个数组\(a, b\)其中\(a\)的第一个数待定。求\(a_1 \in [1, m]\)的每种情况的最小操作数。两个数组满足条件使得两个数组各自删除同样个数的数,然后重排后使得\(a_i < b_i\)

因为可以重排,我们自然是让两个数组都从小到大排。然后\(a\)删去前面一些数,\(b\)删去后面一些数。那么对于\(D1\)\(m=1\),我们只需要二分出最小操作数。
对于\(D2\),我们先看\(m\)作为\(a_1\)的取值范围为\([1, a_2]\),那么\([1, b_1 - 1]\)的操作数是相同的,我们二分求出后面第一个和它操作数相同的数,对于\(m\)作为\(a_i\)取值范围为\([a_{i-1}, a_i]\),那么\([a_{i-1}, b_i - 1]\)的操作数是相同的,同样可以二分求。于是我们从\(m=1\)开始,每次二分求与它操作数相等的数\(j\),然后\(i = j + 1\)这样一直跳即可。发现最多跳\(log_{2}m\)次。

点击查看代码
void solve() {int n, m;std::cin >> n >> m;std::vector<int> a(n), b(n);for (int i = 1; i < n; ++ i) {std::cin >> a[i];}for (int i = 0; i < n; ++ i) {std::cin >> b[i];}std::sort(b.begin(), b.end());auto get = [&](int x) -> int {auto aa = a;aa[0] = x;std::sort(aa.begin(), aa.end());auto check = [&](int x) -> bool {for (int i = 0; i < n - x; ++ i) {if (aa[i] >= b[i + x]) {return false;}}return true;};int l = 0, r = n;while (l < r) {int mid = l + r >> 1;if (check(mid)) {r = mid;} else {l = mid + 1;}}return l;};i64 ans = 0;for (int i = 1; i <= m;) {int l = i, r = m;int t = get(i);while (l < r) {int mid = l + r + 1 >> 1;if (t == get(mid)) {l = mid;} else {r = mid - 1;}}ans += (i64)(l - i + 1) * get(i);// std::cout << get(i) << " " << i << " " << l << "\n";i = l + 1;}std::cout << ans << "\n";
}   

E. Time Travel

题意:有\(t\)个图,每个图有\(n\)个点,\(m_i\)条边。同时给出一个序列,每次你会在第\(a_i\)个图上操作,你每次可以选择走一条边或者不动。你一开始在第\(a_1\)个图的\(1\)号点,你要到第\(n\)号点,求最少几次操作后能到。

对于第\(i\)个图的边\((u, v)\),连上\((u, v, i)\)的边,代表这条边是第几个图上的。那么我们可以\(dijkstra\),记录\(dist_u\)为到\(u\)时的最少操作数。那么我们给每个图在序列里出现的位置存下来,那么对于一条边\((u, v, i)\),我们二分第\(i\)张图大于等于\(dist_u\)这个位置的最小的位置,就可以转移。

点击查看代码
void solve() {int n, t;std::cin >> n >> t;std::vector<std::vector<std::pair<int, int>>> adj(n);for (int i = 0; i < t; ++ i) {int m;std::cin >> m;while (m -- ) {int u, v;std::cin >> u >> v;-- u, -- v;adj[u].push_back({v, i});adj[v].push_back({u, i});}}int k;std::cin >> k;std::vector<std::vector<int>> pos(t);for (int i = 0; i < k; ++ i) {int x;std::cin >> x;-- x;pos[x].push_back(i);}const int inf = 1e9;using PII = std::pair<int, int>;std::vector<int> dist(n, inf);dist[0] = 0;std::priority_queue<PII, std::vector<PII>, std::greater<PII>> heap;heap.push({dist[0], 0});while (heap.size()) {auto [d, u] = heap.top(); heap.pop();if (d != dist[u]) {continue;}for (auto & [v, t] : adj[u]) {auto it = std::lower_bound(pos[t].begin(), pos[t].end(), d);if (it == pos[t].end()) {continue;}if (dist[v] > *it + 1) {dist[v] = *it + 1;heap.push({dist[v], v});}}}int ans = dist[n - 1] == inf ? -1 : dist[n - 1];std::cout << ans << "\n";
}

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

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

相关文章

目前国内可用Docker镜像源汇总(截至2025年2月)

[目前国内可用Docker镜像源汇总(截至2025年2月) - CoderJia](https://www.coderjia.cn/archives/dba3f94c-a021-468a-8ac6-e840f85867ea) 在国内使用 Docker 的朋友们,可能都遇到过配置镜像源来加速镜像拉取的操作。然而,最近几个月发现许多曾经常用的国内镜像站(包括各种…

我的lua使用初体验

本文记录作者第一次使用lua的一次实践,主要借助lua来保证检查锁和释放锁的原子性使用lua实现检查和删除分布式锁的原子性很多时候出现并发问题的根本原因在于检查和操作不是同一个操作,不具有原子性,所以中间会被其他线程插一脚。所以我们需要有一种工具保证这两种操作的原子…

三剑客与正则系列-sed命令

1.概述核心功能:取行,过滤,替换修改文件内容 难点:后向引用(截取). sed stream editor流编辑器.2.格式命令 选项 详细格式 参数sed 选项 条件动作 文件找谁干啥找谁:条件,匹配哪一行,哪些行. 干啥:动作,增删改查. #显示文件的第3行 sed -n 3p /etc/passwd选项 说明-n 取消默认输…

加速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…