2025 代码源 CSP-S 模拟赛复盘

news/2025/10/21 7:34:20/文章来源:https://www.cnblogs.com/lzrqwq2023/p/19154033

Day 16

T1 双重心

分类讨论一下:

  1. 是原树的双重心之一,考虑把这条边割掉,接到另一个连通块的任意一个点上都是可行的。
  2. 不割掉原树上的双重心的边,两侧的连通块内的的任意一条边可以断开,连通块内相互连边就行。
  3. 考虑一条边成为新的双中心之间的边,设这条边为 \((u,v)\)\(u\) 为深度较深的点,如果 \(siz_u > n / 2\),那么就是要在 \(u\) 的子树内割下一块大小等于 \(siz_u - n / 2\) 的子树,可以直接开一个桶来计算,在进入子树 \(u\) 时记录一下大小,离开子树时再记录一下当前的大小,做差就可以得出。如果 \(siz_u < n / 2\),那么就是要在子树外选大小为 \(n/2-siz_u\) 大小的部分割掉,这个部分就是全局大小等于 \(n/2-siz_u\) 的子树减去 \(u\) 子树内大小等于 \(n/2-siz_u\) 的子树个数,这两个部分非常好算,此时我们发现在 \(v\) 到根的这条链上子树大小满足要求的点是不能取的,需要减掉,然而有一些点和子树 \(u\) 以外的点可以组成大小可以满足条件,要将这一部分减去,其实可以开一个桶记录一个点到根的路径上的点的子树大小,在 dfs 离开一个点时回溯,将他减去就可以了。此时的答案就是 全局的-子树内的-链上不符合条件的+链上新增的。

分别计算这些部分即可,1、2 可以一起算,第三个另外算。

CODE

const int mod = 998244353, inf = 0x3f3f3f3f;
const int MAXN = 5e6 + 10;
int n, type, siz[MAXN], sz[MAXN], f[MAXN];
vector<int> g[MAXN], v;
vector<pair<int, int>> p;
ll buc[MAXN], cnt[MAXN], ins[MAXN], ous[MAXN];
ll ans[MAXN];inline int grnd(int &s) {s ^= s << 13;s ^= s >> 17;s ^= s << 5;if (s < 0) s = -s;return s;
}void dfs0(int x, int fa) 
{siz[x] = 1, f[x] = fa;int wt = 0;for (auto y : g[x]){if (y != fa) {dfs0(y, x);siz[x] += siz[y];wt = max(wt, siz[y]);}}wt = max(wt, n - siz[x]);if (wt <= n / 2) v.push_back(x);
}void dfs1(int x, int fa) 
{int tmp = 0;if (siz[x] > n / 2) tmp = cnt[siz[x] - n / 2];else if (n / 2 > siz[x]) tmp = cnt[n / 2 - siz[x]];cnt[siz[x]]++;for (auto y : g[x]){if (y != fa)dfs1(y, x);}if (siz[x] > n / 2) {ll num = cnt[siz[x] - n / 2] - tmp;ans[x] += num * (siz[x] - n / 2) * (n - siz[x]);ans[f[x]] += num * (siz[x] - n / 2) * (n - siz[x]);}else if (siz[x] < n / 2) ins[x] = cnt[n / 2 - siz[x]] - tmp;
}void dfs2(int x, int fa)
{if (siz[x] < n / 2){ll num = cnt[n / 2 - siz[x]] - ins[x] - buc[n / 2 - siz[x]] + ous[n / 2 - siz[x]];ans[x] += num * (n / 2 - siz[x]) * siz[x];ans[f[x]] += num * (n / 2 - siz[x]) * siz[x];}buc[siz[x]]++;for (auto y : g[x]){if (y != fa){ous[n - siz[y]]++;dfs2(y, x);ous[n - siz[y]]--;}}buc[siz[x]]--;
}void dfs3(int u, int fa) {sz[u] = 1;for (auto v : g[u]) {if (v != fa) {dfs3(v, u);sz[u] += sz[v];}}
}int main()
{n = read(), type = read();if (n & 1){cout << 0 << '\n';return 0;}if (type == 1) {for (int i = 1, x, y; i < n; i++) {x = read(), y = read();g[x].push_back(y); g[y].push_back(x);p.push_back(mp(x, y));}}else {int a = read(), b = read(); for (int i = 1; i < n; i++) {p.push_back(make_pair(max(1, i - grnd(b) % a), i + 1));}for (auto edge : p) {int x = edge.first, y = edge.second;g[x].push_back(y); g[y].push_back(x);}}dfs0(1, 0);if (v.size() == 2){for (int i = 1; i <= n; i++) ans[i] += n / 2;memset(sz, 0, (n + 1) << 2); dfs3(v[0], v[1]);for (int i = 1; i <= n; i++) {if (sz[i] < n / 2 && sz[i] > 0) {	ans[v[0]] += (ll)sz[i] * (n / 2 - sz[i]);ans[v[1]] += (ll)sz[i] * (n / 2 - sz[i]);}}memset(sz, 0, (n + 1) << 2); dfs3(v[1], v[0]);for (int i = 1; i <= n; i++) {if (sz[i] < n / 2 && sz[i] > 0) {ans[v[0]] += (ll)sz[i] * (n / 2 - sz[i]);ans[v[1]] += (ll)sz[i] * (n / 2 - sz[i]);}}}dfs1(1, 0);dfs2(1, 0);ll res = 0, P = 1;for (int i = 1; i <= n; i++) {// cout << i << " " << ans[i] << '\n';res = (res + (ans[i] % mod) * P % mod) % mod;P = (P * 2333) % mod;}cout << res << '\n';return 0;
}

T2 线段树

弱化版:E - Segment-Tree Optimization 的做法:

首先可以发现一个性质:如果所有询问至多扫到某一层,那么这一层中的区间对于每个询问要么包含,要么相离。所以,对于询问 $$[l,r]$$,这一层必然存在一个 $$l−1→l$$ 的断点和一个 $$r→r+1$$ 的断点。区间 $$[1,n]$$ 被所有断点切割后形成的区间个数就是这一层的结点个数。既然我们知道了结点个数,由于第 $$x$$ 层至多有 $$2x$$ 个结点,那么我们也能够知道它在哪一层。接下来考虑最小化 $$c$$。对于这一层的所有区间,有两种决策:

  1. 把这个区间拉到上一层,那么就不会造成贡献。
  2. 把这个区间和一个相邻区间合并,然后放到上一层。

对于决策 2 的贡献,我们这样考虑:如果这两个区间是 $$[l,mid)$$ 和 $$[mid,r]$$,合并后的区间就是 $$[l,r]$$。根据题意,所有包含 $$[l,r]$$ 或者跟 $$[l,r]$$ 相离的区间都不会造成贡献。那么造成贡献的就是与 $$[l,r]$$ 相交或者被 $$[l,r]$$ 包含的区间,这些区间会造成 2 的贡献。根据之前的断点可以发现一个小性质:这些造成贡献的区间要么右端点是 $$mid−1$$,要么左端点是 $$mid$$,且满足条件的区间必然会造成贡献。可以维护以某个下标为左端点或者右端点的区间个数来快速求出贡献。唯一的限制是上一层的区间个数不能超过 $$2d−1$$。设 $$fi,j$$ 表示考虑到这一层从左往右第 $$i$$ 个区间,且上一层当前有 $$j$$ 个区间的贡献最小值。按照决策 DP 即可。时间复杂度 $${O(n2+q)}$$。

Day 17

A. 优势种类

我们不难发现性质:只要在任意一个长度为 3 的区间存在绝对众数,那么一定可以传播到整个区间,那么只需要将

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

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

相关文章

2025.10.21——1绿

普及+/提高 P1347 排序 wpmx昨晚写的有意思的题,数据范围比较小,我就直接用set+m次拓扑排序,30min写出来,要注意输出顺序后的句号,以及特判n==1

【JavaScript-基础】map、forEach、for、for in、for of等的区别

tips:循环虽好,大家都得按自己所需场景进行使用。个人建议,不喜勿喷 forEach forEach: forEach(item,index,array), item:当前处理的数据,index:下标, array:整个数组 遍历全部数据,不能通过return结束循环,消耗…

dotnet 利用 Windows 注册表实现开机自动启动

本文记录一个开机自动启动实现方法,通过写入到注册表实现开机之后,用户登录完成之后让应用程序开机自启本文将演示写入 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 注册表路线,实现应用程序…

帮我回答这些问题

◦ 以太坊交易的数据结构及EIP1559/712协议的理解。 ◦ 以太坊的账⼾是如何⽣产的,公私钥的关系。 ◦ 以太坊区块链浏览器⼀般会展⽰哪些信息,⼤概能知道。 ◦ 以太坊交易nonce的作⽤,nonce异常交易如何处理。 ◦ 以…

使用uWSGI和Nginx部署深度学习模型指南

本文详细介绍了如何通过uWSGI应用服务器和Nginx反向代理将深度学习模型部署为可扩展的Web服务,涵盖WSGI协议原理、服务器配置步骤及性能优化要点,帮助构建高并发生产级AI应用。如何使用uWSGI和Nginx部署深度学习模型…

Python 类属性的应用场景

Python 类属性的应用场景 在面向对象编程中,类属性作为一种特殊的属性形式,始终扮演着“共享者”与“管理者”的角色。与实例属性为每个对象单独存储数据不同,类属性属于类本身,被所有实例共同拥有和访问。这种特性…

快速提升Entra ID安全性的实用指南

本文详细介绍了如何通过配置用户默认设置、保护特权角色、管理条件访问策略等关键步骤,快速提升Microsoft Entra ID的安全性,帮助企业构建更强大的云身份防护体系。快速提升Entra ID安全性 在2025年10月的BSides北弗…

为什么很多人分不清关联和聚合?

为什么很多人分不清关联和聚合 这个问题确实很常见,很多人(包括有经验的开发者)都会混淆关联和聚合。让我从多个角度分析这个现象的原因。 主要混淆原因 1. 代码实现的高度相似性 # 关联关系的代码 class Universit…

机器学习商业应用实战指南

本文详细介绍了在企业中应用机器学习的完整流程,从问题识别到团队建设、基础设施搭建、数据策略制定,再到MVP开发和持续迭代,为企业实施AI转型提供了系统性的技术指导。将机器学习应用于您的业务 在这篇文章中,我将…

在线签名工具,手写签名保存为png图片,用于生成电子签名用于word文档等

原文链接:https://blog.nanzhi.vip/?article_id=30&type=software 应用案例: 每天进步一点点

什么情况下,有必要将属性设为类属性而非实例属性?

类属性(Class Attribute)是定义在类中、不属于任何实例的属性,它被该类的所有实例共享。将属性设为类属性而非实例属性的必要性,主要体现在数据共享、全局状态维护、节省内存等场景中。以下从核心作用和具体示例两…

在线签名工具,保存为png图片,用于生成电子签名用于word文档等

原文链接:https://blog.nanzhi.vip/?article_id=30&type=software 应用案例: 每天进步一点点

玄机——第五章 Windows 实战-evtx 文件分析

第五章 Windows 实战-evtx 文件分析 切勿在本地运行 1.将黑客成功登录系统所使用的IP地址作为Flag值提交; 拿到文件后传入虚拟机打开 第一个是安全日志,在日志中过滤编号为4625(登录失败),4624(登录成功)的事件 从下…

251021

251021一觉醒来,我又活在了那份恐慌里,脚下飘飘,身体却很沉,这是清醒的代价,天堂和地狱都在人间

CityRefer:城市规模点云数据上的地理感知 3D 视觉接地数据集 - MKT

CityRefer:城市规模点云数据上的地理感知 3D 视觉接地数据集 城市规模的 3D 点云是表达精细复杂户外结构的一种有效方式。它涵盖了城市各个组成部分(包括汽车、街道和建筑物)的外观和几何特征,可用于实现自动驾驶汽…

SensatUrban语义分割数据集SensatUrban - MKT

SensatUrban语义分割数据集SensatUrban https://github.com/QingyongHu/SensatUrban 地面:包括不透水表面、草地、地形 植被:包括乔木、灌木、树篱、灌木丛 建筑:包括商业/住宅建筑 墙体:包括栅栏、高速公路护栏…

推荐算法参考资料

协同过滤 https://cloud.tencent.com/developer/article/1085760 Wide & Deep https://blog.csdn.net/qq_42363032/article/details/115935964 DIN https://blog.csdn.net/u012328159/article/details/123043033 指…

LLM学习笔记DAY8

📘今日学习总结 大语言模型提示技术学习笔记 1 提示工程 1.1 提示设计关键要素 五大核心要素:任务描述:清晰明确的任务指令,包含目标、限制条件、数据格式等 上下文信息:提供背景知识,帮助模型突破知识局限 输入…

软件工程第二次团队作业——构建一个智能体

这个作业属于哪个课程 软件工程这个作业要求在哪里 作业要求这个作业的目标 构建一个AI智能体,不仅能通过自然语言交流(会说),更能理解指令意图,并自动调用工具、访问数据或执行代码来完成任务(会做),最终在一…

VoxelNeXt 用于 3D 对象检测和跟踪的完全稀疏 VoxelNet(CVPR 2023) - MKT

VoxelNeXt 用于 3D 对象检测和跟踪的完全稀疏 VoxelNet(CVPR 2023) https://github.com/dvlab-research/VoxelNeXt