VP Educational Codeforces Round 157 (Rated for Div. 2)

news/2025/2/4 21:31:13/文章来源:https://www.cnblogs.com/maburb/p/18698509

A. Treasure Chest

题意:你要经过\(y\)然后到\(x\),你可以让\(x\)最多移动\(k\),求最短距离。

如果\(y \leq x\),答案就是\(x\)
否则尽量把\(x\)\(y\)移就行。

点击查看代码
void solve() {int x, y, k;std::cin >> x >> y >> k;if (y <= x) {std::cout << x << "\n";} else {std::cout << std::max(y, 2 * (y - x - k) + x + k) << "\n";}
}

B. Points and Minimum Distance

题意:把\(2n\)个数分成\(n\)个坐标,然后按顺序经过每个点,两点之间距离为曼哈顿距离,求距离最短。

单独看一个坐标,我们肯定希望能递增或递减的走,否则走过去一点又走回来肯定走的更多。
那么我们把所有数组排序,因为起点到终点要包含\(n\)个点,所以可以选前\(n\)个为\(x\)坐标,后\(n\)个为\(y\)坐标,这样总距离为这时距离就相当于是相邻两数之差,就等于\(a_n - a_1 + a_{2n} - a_{n+1}\)。可以证明这样走的距离最短,因为交换任意位置都会使得距离增加。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(2 * n);for (int i = 0; i < 2 * n; ++ i) {std::cin >> a[i];}std::sort(a.begin(), a.end());std::cout << (a[n - 1] - a[0] + a[2 * n - 1] - a[n]) << "\n";for (int i = 0; i < n; ++ i) {std::cout << a[i] << " " << a[i + n] << "\n";}
}

C. Torn Lucky Ticket

题意:又\(n\)个长度小于\(5\)的数字,求有多少点对使得\(s_i + s_j\)是幸运的,一个数字是幸运的那么它的长度是偶数并且前半部分数字和等于后半部分数字和。\(s_i + s_j\)就是两个数字拼接起来。

直接枚举每个数字作为较长的那一部分的贡献,分为在前面时和在后面时。用\(map\)统计长度为\(len\)总和为\(s\)的数字的个数。因为每个数字统计的数长度小于自己,所以先把数字按长度排序。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<std::map<int, int> > cnt(6);std::vector<std::string> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}auto get = [&](std::string s) -> int {int res = 0;for (auto & c : s) {res = res + c - '0';}return res;};std::sort(a.begin(), a.end(), [&](std::string & a, std::string & b) {return a.size() < b.size();});i64 ans = 0;for (int i = 0; i < n; ++ i) {int len = a[i].size();for (int j = len; j > len / 2; -- j) {int x = get(a[i].substr(0, j)), y = get(a[i].substr(j));ans += cnt[j * 2 - len][x - y];}for (int j = len; j > len / 2; -- j) {int x = get(a[i].substr(len - j)), y = get(a[i].substr(0, len - j));ans += cnt[j * 2 - len][x - y];}cnt[len][get(a[i])] += 1;}std::cout << ans + n << "\n";
}

D. XOR Construction

题意:给定一个数组\(a\),你要构造一个\(b\),使得\(0\)\(n-1\)都恰好出现一次,并且\(a_i = b_i \oplus b_{i+1}\)

\(b_{i + 1} = a_i \oplus b_i\)。列出前\(i\)个式子发现\(b_i\)等于\(a\)的前缀异或和异或\(b_1\)\(sum_{i - 1} \oplus b_1\),只要确定\(b_1\)的值就可以求出\(b\)。那么我们枚举\(b_1\),看它和这些\(sum\)的最大异或和有没有超过\(n-1\),只要没超过就合法。因为题目保证有解,所以\(sum_i != sum_j, (i != j, 1 <= i, j < n)\),则不可能有两个相等的\(b\),又因为最大不超过\(n-1\),则可以保证恰好每个数出现一次。

点击查看代码
struct TrieWith01 {std::vector<std::array<int, 2> > tr;int idx;int creat() {tr.push_back({});idx += 1;return idx;}TrieWith01() {creat();idx = 0;}void insert(int x) {int p = 0;for (int i = 30; i >= 0; -- i) {int s = x >> i & 1;if (!tr[p][s]) {tr[p][s] = creat();}p = tr[p][s];}}int xor_max(int x) {int p = 0;int res = 0;for (int i = 30; i >= 0; -- i) {int s = x >> i & 1;if (tr[p][!s]) {res += 1 << i;p = tr[p][!s];} else {p = tr[p][s];}}return res;}
};void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i + 1 < n; ++ i) {std::cin >> a[i];}TrieWith01 tr;int sum = 0;for (int i = 0; i + 1 < n; ++ i) {sum ^= a[i];tr.insert(sum);}std::vector<int> b(n);for (int i = 0; i < n; ++ i) {int x = tr.xor_max(i);if (x == n - 1 || (x == n - 2 && i == n - 1)) {b[0] = i;for (int j = 1; j < n; ++ j) {b[j] = b[j - 1] ^ a[j - 1];}break;}}for (int i = 0; i < n; ++ i) {std::cout << b[i] << " \n"[i == n - 1];}
}

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

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

相关文章

4G优先级切换

本文来自博客园,作者:{IceSparks},转载请注明原文链接:https://www.cnblogs.com/IceSparks/p/18698508

4G与5GSIB对比

本文来自博客园,作者:{IceSparks},转载请注明原文链接:https://www.cnblogs.com/IceSparks/p/18698503

AI赋能软件测试:未来已来,你准备好了吗?

ps:文末有福利领取哦引言 在数字化转型的浪潮中,软件测试作为保障产品质量的关键环节,正面临着前所未有的挑战。 传统的测试方法已难以满足快速迭代和复杂场景的需求,而人工智能(AI)的引入,则为软件测试带来了革命性的变化。 本文将从现状、优势、挑战及未来趋势四个方面…

C语言 输出回文数

回文数,既把数值的每个数 颠倒输出(从右往左输出),再合起来的数如果和原来的值相等 例:输出0 至 1993 的回文数#include <stdio.h>int main() { int i ,x ,d ,a ; for(i=0;i<=1993;i++) {a = i; x = 0; while (a != 0) { d = a%10; //每次都取a值的最后一位 x = …

洛谷 P3842 [TJOI2007] 线段 题解

题目大意 原题链接 给你一个大小为 \(n \times n\) 的矩阵,上面有 \(n\) 条线段(一行一条)。你只能向右,向下,向左走。每一条线段都必须完整的经过。请问从 \((1,1)\) 到 \((n,n)\) 最短路径长度是多少? 解法 这道题可以使用最短路或者DP来做。我觉得DP本题更简单一点所以我…

数据降维技术研究:Karhunen-Love展开与快速傅里叶变换的理论基础及应用

在现代科学计算和数据分析领域,数据降维与压缩技术对于处理高维数据具有重要意义。本文主要探讨两种基础而重要的数学工具:Karhunen-Love展开(KLE)和快速傅里叶变换(FFT)。通过分析这两种方法的理论基础和应用特点,阐述它们在数据降维中的优势和适用场景。 Karhunen-Lov…

一个Python GC的小Bug

这个代码是在看了“码农高天”的视频照模仿的。虽然 GC 能完成大部分内存管理的工作,但是基于性能计数器的GC确实存在小 Bug,这一点还是需要通过del和gc.collect手动管理。 from typing import Optionalclass Object:def __init__(self, name: str) -> None:self.obj: Opt…

2月做题记录

还有一个月。2月做题记录✩ trick ✯ 会大部分,要\(tj\)提示 ✬ 会小部分/完全没想到,看了\(tj\)才会 ◈ 脑电波 ✡ 有某一算法的神秘通用性质 ⊗ 待补目录2月做题记录字符串CF1827CCF1913FP10716P11150 ✩✯树[NOI2021] 轻重边做法1 ✩做法2做法3 ✡《简单树剖练习题》[QOJ9…

第六节 特征提取和无监督学习

没有标签y依旧提取出特征你的模型朝着哪个方向压缩特征,由你的标签来定自监督学习:从x中提取一部分作为自己的标签y,然后用x预测y 在自监督学习中,需要根据数据的特点设计一些自监督任务,这些任务通常基于数据的一些内在属性或关系来构建。例如,在图像数据中,可以设计图像…

产线MES 和 车间MES的区别与联系

制造执行系统(MES)在现代制造业中扮演着至关重要的角色,它连接着企业的计划层与生产现场,推动生产效率提升和质量管控强化。本文将深入探讨产线级MES和车间级MES的区别与联系,帮助读者更好地理解这两种MES系统如何协同工作,共同提升企业的生产管理水平。制造执行系统(ME…

CF995

A link如果选择这一天做题可以让差增加(即我这一天的题数大于他下一天的题数),则选;否则不选。 特殊的,另一个人地\(n+1\)天我们钦定他做了\(0\)道题。点击查看代码 #include<bits/stdc++.h>using namespace std;int n; int a[105],b[105];void qwq(){cin >> …