2022 ICPC Hangzhou

news/2025/10/19 22:03:47/文章来源:https://www.cnblogs.com/Young-Cloud/p/19151510

2022 ICPC Hangzhou

A

令初始序列的和为 \(sum\),则最后的和是 \(sum + ns + {n(n + 1) \over 2}d\),我们令 \(f(x) = (sum + x) \% m, x \in [0, m)\),显然这是一个分段函数,令 \(x = y\) 时,\(f(x) = 0\)。当 \(x = ns + {n(n + 1) \over 2}d\) 时,\(x\) 能取到值只能是 \((k \times gcd(n, {n(n + 1) \over 2})) \% m\),于是有 \(k\times gcd(n, {n(n + 1) \over 2}) = t\times m + x\),即 \(k\times gcd(n, {n(n + 1) \over 2}) + (-t) \times m = x\)。由拓展欧几里得我们可以解出一组使得 \(x\) 最小的 \(k\)\(-t\),然后看看这个最小的 \(x\) 能否通过乘上一个系数来成为大于等于 \(y\) 的一个数,如果能让解得的 \(k\) 乘上这个系数。得到 \(k\) 之后,就是要解 \(ns + {n(n + 1) \over 2}d = k\times gcd(n, {n(n + 1) \over 2})\),由拓展欧几里得解就好了。

int extend_gcd(i64 a, i64 b, i64 &x, i64 &y) {if (b == 0) {x = 1, y = 0;return a;}int res = extend_gcd(b, a % b, x,  y);int t = x;x = y;y = t - (a / b) * y;return res;
}std::pair<i64, i64> getpair(i64 a, i64 b) {i64 x = 0, y = 0;extend_gcd(a, b, x, y);return { x, y };
}void solve() {int n = 0;i64 m = 0;std::cin >> n >> m;i64 sum = 0;for (int i = 0; i < n; ++i) {int a = 0;std::cin >> a;sum += a;}sum %= m;i64 s = 0, d = 0;i64 g = extend_gcd(1ll * n, 1ll * n * (n + 1) / 2, s, d);i64 k = getpair(g, m).first % m;if(k < 0) {k += m;}i64 t = (((m - sum - 1) % m) / std::__gcd(g, m) + 1) % m;if (t * std::__gcd(g, m) < m) {(k *= t) %= m;}s %= m;d %= m;(s *= k) %= m;(d *= k) %= m;if (s < 0) {s += m;}if (d < 0) {d += m;}i64 ans = (sum + k * g) % m;std::cout << ans << '\n';std::cout << s << ' ' << d << '\n';return;
}

C

进行阅读理解后,可以将题目转化为:有 \(n\) 个物品,每个物品有体积和价值,要求选择若干物品放入容量为 \(k\) 的背包,特别的,当最后一件物品不能放入背包时,可以将该物品的体积减小至恰好填满背包,同时价值变化为对应的价值。

于是设计 \(f_{i, j, 0/1}\) 表示前 \(i\) 件物品,占 \(j\) 体积且 0(还未)/1(已经) 确定了那件减小体积的物品时,价值的最大值。

转移是 trivial 的。但是要注意初始化的问题,需要初始化为 \(-Inf\)。并且,由于可能所有物品都填不满背包,所以答案 \(f[n][k][1]\) 要跟 \(max_j\{f[n][j][0]\}\) 取最大值。并且注意不能跟 \(max_j\{f[n][j][1]\}\) 取最大值,因为当有物品被缩小体积时,背包一定能被填满,\(j < k\) 的情况都是不合法的。

int n, m;
i64 f[K + 5][2], g[K + 5];
int p[N + 5][P + 5];i64 cnt(i64 s) {for (int i = 0; i <= s; ++i) {for (int j = 0; j < 2; ++j) {f[i][j] = -Inf;}}f[0][0] = 0;i64 res = 0ll;for (int i = 1; i <= n; ++i) {for (int j = 0; j <= s; ++j) {g[j] = f[j][1];}int w = 0;i64 v = 0ll;for (w = 1; w <= p[i][0]; ++w) {v = p[i][w];for (int j = s; j >= w; --j) {f[j][1] = std::max(f[j][1], f[j - w][0] + v);}}w = p[i][0];v = p[i][w];for (int j = s; j >= w; --j) {f[j][0] = std::max(f[j][0], f[j - w][0] + v);f[j][1] = std::max(f[j][1], g[j - w] + v);res = std::max(res, f[j][0]);}}return std::max(res, f[m][1]);
}void solve() {std::cin >> n >> m;for (int i = 1; i <= n; ++i) {std::cin >> p[i][0];for (int j = 1; j <= p[i][0]; ++j) {std::cin >> p[i][j];}}std::cout << cnt(m) << '\n';
}

K

对于每两个字符串(较短串是较长串的前缀除外),我们记录下第一个字符不相同的位置,并记录下该位置的两个字母。给出字母表时查一下就好了。比如两个字符串 ab ac,则将 b c 记录下来(cnt[b][c]++),当给出字母表时,若在字母表中 c 在 b 前面,则 ans += cnt[b][c]。处理出 \(cnt\) 可以用字典树,对于一个串是另一个串的前缀的情况,在插入字典树是单独处理就好了。

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

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

相关文章

KL散度

有两个概率分布:真实分布 P(x):世界的真实规律;模型分布 Q(x):我们模型预测的结果。 KL 散度衡量的就是这两个分布之间的“距离”:\(D_{KL}(P||Q) = \sum_{x}^{}{P(x)log\frac{P(x)}{Q(x)}}\). 越接近 0 → 模型越…

custom_document

custom_documentfrom llama_index.core import Document from typing import Dict, Any, Optional, List from pydantic import Field import jsonclass CustomDocument(Document):"""自定义文档类,扩…

Win11常用的bat脚本

win11常用的bat脚本1.移除桌面显示的了解此图片图标: @echo offREM REF// https://www.cnblogs.com/Chary/p/18096583reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesk…

随便记

要退役了,所以还是强迫自己写一些做题记录 10-14 新歌发了 CF 1049 C: 没啥好讲,记住在博弈中先手有时可以直接模仿后手操作抵消影响 10-15 看直播了 CF 1049 E: DP整体朴素,学一个通过 \(\ge or \le x\) 的答案差分…

历史和线段树

我们一般在处理区间修改的操作时,会在线段树上打懒标记,意思是这个结点所代表的区间中的所有数都要同时进行一系列修改。为了更容易理解历史和线段树,我们先来回顾一下普通线段树的区间加操作。 \(\mathbf{Preperat…

Map与Map.Entry的区别

Map与Map.Entry的区别目录Map与Map.Entry的区别Map:键值对的集合Map 的创建与本质Map 的无序性对 Map 进行排序的标准流程Map.Entry:键值对的“名片”功能Map.Entry的作用 Map:键值对的集合 Map 的创建与本质 Map 是…

真诚

我能毫无保留的给出我的真诚,这绝非意味着它的廉价更不代表我的愚笨相反这代表我本身就很好......

申公豹说

申公豹: 我单枪匹马走到现在,任何人都不是我的靠山能折磨我的,都是我在意的,只要我不在意了,天奈我何,这个世界的规则就是,只要你放弃不要了,一切都解了,无情,可破万局.... AI:你的这段话里,既有孤绝的清…

大数据分析之MySQL学习2

一、模型和数据模型 (一)模型 是现实世界特征的模拟和抽象,例如地图、建筑设计沙盘、模型飞机、汽车模型等。 (二)数据模型(Data Model) 是现实世界数据特征的抽象,具有以下特点:从计算机实现的观点对数据建模…

[KaibaMath]1012 关于收敛数列保号性的推论的证明

[KaibaMath]1012 关于收敛数列保号性的推论的证明收敛数列保号性的推论是基于保号性定理(极限非零则后期项同号) 衍生的重要结论。下面给出证明。

CSP-S模拟赛加赛 比赛总结

CSP-S模拟赛加赛T1 T2 T3 T4100 AC 60 RE 15 TLE 37 WA总分:212;排名:4/5。 T1 A 了,T2 部分分,T3 挂了 20 分,T4 干了 1.5h,思路基本正确,码力太差细节太多,最后输出 0。 T1 Divisors 不难,不说了。 #inclu…

赛前训练 12 树的直径、中心和重心

A 树的直径板子. B 注意到树的直径有个性质:所有节点到其他点的最远距离一定在直径的端点处取到.怎么证明请查阅往期笔记. 这样,我们把直径留着,将其他点依次和端点匹配,最后加上直径的贡献就得到了第一问的答案. 那么…

我要好好写博客了 - Milo

1 目的 记录自己在编程过程中遇到的问题和想法,以及在学习新知识时的知识点 2 为什么突然想要好好经营一个博客 我很喜欢互联网的开源精神,我是2020年上的大一,在大四的时候,AI出现了。 在AI出现之前,我的几乎所有…

关于无人巡航小车的学习笔记

文件名:zmd_ws zmd为队伍名称,下横杠代替空格,ws全称为workspace,即工作空间。工作空间的分隔原理暂时不知道? 文件名:build,devel 用于存放执行catkin_make后的编译文件,也就是编译ROS(src文件夹下)包时所…

[fastgrind] 一个轻量级C++内存监控及可视化开源库

目录Fastgrind引言 简介 仓库结构 快速开始编译 testcase 运行 testcase 调用堆栈 Report如何在你的项目中使用手动插桩的使用方法 自动插桩的使用方法fastgrind 输出与分析fastgrind.text fastgrind.json可视化 fastg…

详细介绍:springboot+vue智慧旅游管理小程序(源码+文档+调试+基础修改+答疑)

详细介绍:springboot+vue智慧旅游管理小程序(源码+文档+调试+基础修改+答疑)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

iOS/Swift:深入理解iOS CoreText API

iOS/Swift:深入理解iOS CoreText API这篇文章是从0到1自定义富文本渲染的原理篇之一,此外你还可能感兴趣:一文读懂字符与编码 一文读懂字符、字形、字体 一文读懂字体文件 从0到1自定义文字排版引擎:原理篇 逆向分…

存算一体架构的先行者:RustFS在异构计算环境下的探索与实践

存算一体架构的先行者:RustFS在异构计算环境下的探索与实践随着AI大模型与边缘计算蓬勃发展,传统"存储-计算"分离架构的"存储墙"瓶颈日益凸显。本文将深入解析RustFS如何通过存算一体设计在异构…

Appium 3.0:跨平台移动自动化测试框架全面解析

Appium是一个开源的跨平台自动化测试框架,支持原生、混合、移动Web和桌面应用的测试。基于WebDriver协议,提供丰富的驱动和插件生态系统,支持多种编程语言,让移动应用测试变得更加简单高效。Appium 3.0:跨平台移动…

德国州政府全面弃用微软办公套件,改用开源方案

德国州政府全面弃用微软办公套件,改用开源方案德国州政府全面弃用微软办公套件,改用开源方案来源: OSCHINA 编辑: 局 2025-10-16 19:24:043德国石勒苏益格 - 荷尔斯泰因州宣布,已正式完成从微软 Outlook 和 Exchang…