多校A层冲刺 NOIP2024 模拟赛 01

news/2024/10/3 21:26:09

T1 构造字符串

签到题

注意到 \(n\)\(m\) 较小,直接扫一遍用并查集维护他所描述的情况,并将不同的位置记录下来,若存在不同的位置属于同一个集合则不可能构成,否则贪心从前往后取 mex 即可。

时间复杂度 \(O(nm\alpha(n))\)

T2 寻宝

签到题

首先先用并查集将大联通块缩点,注意到 \(m\) 很小,可直接连边然后 \(bfs\) 判断连通性。

时间复杂度 \(O(nm\alpha(nm)+qk)\)

T3 序列

李超线段树

注意到对于给定 \(p\) ,最大时的左右端点 \(l,r\) 是相互独立的,可以分开单独求解

\(A_i=\sum_{j=1}^{i}a_i\ \ \ \ B_i=\sum_{j=1}^{i}b_i\)

即求

\(右=A_r-A_p-k(B_r-B_p)\)

\(\quad\ =\max_{r>=p}\{-B_r k+A_r\}-A_p+kB_p\)

\(左=A_p-A_l-k(B_p-B_l)\)

\(\quad\ =\max_{l<p}\{B_l k-A_l\}+A_p-kB_p\)

\(相加相消:左=\max_{l<=p-1}\{B_lk-A_l\}\ \ 右=\max_{r>=p}\{-B_rk+A_r\}\)

注意到是一次函数形式,\(k\) 不大,直接上李超线段树维护即可。

\(p\) 不是单调的,离线下类似扫描线,扫一遍一个一个加进去即可

T4 构树

计数题,二项式反演,树类问题,Cayley公式

前置知识:

  • 二项式反演:\(f(n)=\sum_{i=n}\binom{i}{n}g(i) ⟺ g(n)=\sum_{i=n}(-1)^{i-n}\binom{i}{n}f(i)\)

  • Cayley公式:一个完全图有 \(n^{n-2}\) 棵无根生成树。

  • 扩展Cayley公式:被确定边分为大小为 \(a_1,a_2,\cdots, a_m\) 的连通块,则有 \(n^{m-2}\prod {a_i}\) 种生成树。

  • \(shrink\_to\_fit()\):释放容器内存

题目所求即恰有 \(i(i\in[0,n-1])\) 条边属于原树边的方案数,记为 \(g(i)\)

二项式反演套路设 \(f(i)\) 为钦定 \(i\) 条边属于原树边的方案树,\(g\)\(f\) 显然满足二项式反演。

问题转移到求解 \(f(i)\)

根据扩展 Cayley公式,可以状压枚举边的情况然后直接套公式计算,时间复杂度 \(O(2^nn\alpha(n))\) 期望得分 \(65pts\)

正解考虑公式的组合意义从而设计状态进行 \(DP\)

对于一种情况 \(ans=n^{m-2}\prod_{i=1}^{m}a_i=\frac{n^m\prod_{i=1}^{m}a_i}{n^2}\) 考虑分子的组合意义,\(n^m\) 这个东西不需要考虑直接在每个连通块中将初始值设为 \(n\) 即可求解,对于 \(\prod a_i\) 即从每个连通块中恰选一个点的方案数。

那么可以设计状态 \(dp_{i,j,0/1}\) 表示在点 \(i\) 的子树中,选择了 \(j\) 条边,点 \(i\) 所在的连通块是否已经选择一个点,树上背包转移即可。

转移方程式是朴素的,按照公式转移,注意初始值设定为 \(n\) 即可

但是本题卡空间,为了节省空间考虑状态用 \(vector\) 来存,在儿子的状态转移完成后将其 \(clear()\),然后使用 \(shrink\_to\_fit()\) 做到真正的释放内存,空间复杂度 \(O(n)\)

时间复杂度分析
\(DP\) 部分:考虑每个点被合并的次数大概是 \(\sum_{o\in tree} n-size_o\)\(O(n^2)\) 级别
二项式反演部分显然是 \(O(n^2)\)
即总时间复杂度为 \(O(n^2)\)

p

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Android 简介

安卓 (Android) 是一种基于 Linux 内核的自由及开放源代码码的操作系统. 主要用于移动设备, 如智能手机和平板电脑, 由美国 Google 公司和开放手机联盟领导及开发. Android 操作系统最初由 Andy Rubin 开发, 主要支持手机. Android 是一种操作系统. Android 系统是开放源代码的…

listary

一、概述 Listary Pro 是一款功能强大的文件管理工具,通过快速搜索、文件夹导航、第三方应用集成和标签管理等功能,大大提升了用户的文件管理效率。无论是在工作中还是日常生活中,Listary Pro 都能成为用户不可或缺的助手。如果你还在为文件查找和管理而烦恼,不妨试试 List…

十、特殊应用:人脸识别和神经风格转换

1、One-Shot学习(One-shot learning)人脸识别所面临的一个挑战就是需要解决一次学习问题(one-shot learning problem),这意味着在大多数人脸识别应用中,你需要通过单单一张图片或者单单一个人脸样例就能去识别这个人。而历史上,当深度学习只有一个训练样例时,它的表现并…

python高级内置函数

filter函数返回迭代器

表情包

创建于 8.1 updated on 10.3:整理博客时发现这个了,当时不敢发,现在没啥问题了吧,毕竟涉及人员都 【数据删除】 了,遂发布。 整理博客发现欧耶! https://img2024.cnblogs.com/blog/3365934/202407/3365934-20240725151423252-219730277.png 害羞 起飞呦 哒咩

VulnHub2018_DeRPnStiNK靶机渗透练习

据说该靶机有四个flag 扫描 扫描附近主机arp-scan -l扫主目录扫端口 nmap -sS -sV -n -T4 -p- 192.168.xx.xx 结果如下 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-30 19:25 CST Nmap scan report for 192.168.93.131 Host is up (0.0024s latency). Not shown: 6…

昨天放洛谷的图

因为刷不出来以及有人问所以放这了

python多进程debug

代码调试 问题阐述 最近遇到一个python debug多进程的问题 有一个进程A,这个进程会fork出8个进程B,fork join结束后,又会fork出8个进程A。 假设按时间有序,我就只想断fork出的第一个B和第一个进程A,怎么做?(breakpoint just break only once)类似于java多线程调试的意思…