牛客练习赛127

news/2024/10/6 3:42:50/文章来源:https://www.cnblogs.com/spdarkle/p/18287048

还没补E,感觉很GF。

个人感觉质量挺好,拿 CF Div.2 来对标也是出的比较好的一场。唯一的缺陷可能是E/F应该换个位置?

简要写个题解?

A

给定数组 \(a\),以及常数 \(k\),定义 \(w(i,j)\)\(|a_i-a_j|>k\) 时候为 \(\max(a_i,a_j)\),否则为 \(\min(a_i,a_j)\)

显然排序之后贪心将 \(w(n-1,n),w(1,n)\)\(\max\) 即可。

\(O(n\log n)\),可以优化到 \(O(n)\)

B

给定一个正整数 \(N\) 的质因子分解 \((p_i,c_i)\)\(N=\prod_{i=1}^np_i^c_i\),给定 \(d\),求 \(\sum_{i|N}i^d\)。对 \(10^9+7\) 取模。

显然就是

\[\prod_{i=1}^n(\sum_{j=0}^{c_i}p_i^{d·j}) \]

不知道后面这个式子用等比数列求和分母会不会变成零,总之对于 \((1+p+p^2+p^3+……+p^m)\) 可以利用分治法进行求解。

也即设原式值为 \(S(p,m)\),当 \(m\) 为奇数时,可以 \(S(p,m)=S(p,m-1)\times p+1\)

否则有 \(S(p,m)=(S(p,m/2)-1)\times p^{m/2}+S(p,m/2)\),可以 \(O(\log^2 m)\) 计算。

\(O(n\log^2 n)\)

C

给定 \(n\)\(m\) 边带权无向图,多次询问 \(L,R\),求能否选出一个边集,使得至少有 \(L\) 个连通块,至多有 \(R\) 个连通块,如果可以,求出这个边集里可能的最小边权的最大值。

容易发现 \(L\) 是基本全没啥用的。因为我们可以通过对这个边集把除了答案边之外的边一条条删去,肯定会增加连通块个数。

更加形式化一点,对于答案边 \((u,v,w)\),其所有的边 \((u_i,v_i,w_i)\) 若有 \(w_i\ge w\),则将其加入 \(E\) 中一定不影响答案。

假定全部加入这样的边后有 \(k\) 个连通块,那么我们显然可以通过这些边做到有 \([k,n-1]\) 个连通块。

证明:考虑加入所有边后,对各个连通块都求一颗生成树,其余非生成树边删去,那么我们可以任意断开一条非答案边都会使得答案不变且连通块个数增加一,最终可以做到只保留答案边,\(n-1\) 个连通块。

那就简单了,直接模仿 Kruskal 算法,将边权从大到小排序,依次加入,维护连通块个数。不妨设加入 \([1,i]\) 边后有 \(c_i\) 个连通块。

那就是找到第一个 \(\le R\)\(c_i\),其 \(w_i\) 即为答案。找不到就无解。

\(O((n+q)\log n)\)

D

给定一棵树,最初全为白色,要求将至多 \(k\) 个点染为黑色,要求最终白色点对之间距离最大的最小。\(0\le k<n-2<n\le 1000\)

显然二分答案。

我们倒过来看最终局面,我们断言最终局面,所有白点定然是一个连通块。

证明:如果不是这样,考虑一个孤立的白点,将其染为黑色,然后将原白点连通块与该白点最长路径上遇到的第一个黑点变白,答案一定不会变差,因为以该白点为端点的所有路径的最大值定然比这个新的白点与连通块中点的所有路径最大值更大。对每个白点都进行这样的操作,最终一定会变成一个连通块。

那么假设二分答案为 \(mid\),我们要判断能否选出一个连通块,在满足直径不长于 \(mid\) 的情况下,大小为 \(n-k\)

更强的信息:求出可以选出的最大大小的连通块。

不妨设 \(f_{u,i}\) 为在子树 \(u\) 内,包含 \(u\),最长链为 \(i\) 的合法连通块最大大小。

初始:\(f_{u,0}=1\)

转移:\(f'_{u,\max(i,j+1)}=\max(f_{u,\max(i,j+1)},(f_{u,i}+f_{v,j})[i+j+1\le mid])\)

然后所有可行的最大的 \(f_{i,j}\) 即为所求。

\(O(n^2\log n)\)

code

说个需要注意的点:其实我们在二分 \(mid\) 后可以将所有距离 \(\ge mid\) 的点对全部连边,就是判断是否存在一个点覆盖,满足其大小 \(\le k\)

也就是最小点覆盖问题。我因为把一般图最小点覆盖和二分图最小点覆盖搞混,打网络流吃了2罚时

E

暂时不会,感觉很生成函数(有点组合符号化的构造感觉)。MD我生成函数学的像个什么一样

F

给定一颗基环树,保证不是自环,每条边有边权,定义简单路径为 不经过重复边 的路径,定义路径权值为路径上所有边边权的异或和。

给定 \(k\),求所有下标差不超过 \(k\) 的点中,最大的路径权值是多少。

草了看成了不经过重复点,居然有75,恐怖如斯

首先如果是一棵树,我们直接预处理 \(dis_i\) 为根到 \(i\) 路径的权值,然后利用 \(trie\),记录一个最大时间戳直接查就完了,这是经典问题。

对于环的处理,我们先考虑第一类路径:顺时针走。

考虑选定环上一个点为起点,然后先对环做一个异或前缀和作为环上点的 \(dis\),然后对于环上各个点再跑 DFS 处理出各自点的 \(dis\) 即可。

那么如果一个点对,下标差不超过 \(k\),简单路径不过环,则直接查(也即按照 \(1\to n\)\(dis_i\) 插入环中,同时查询 \([max(1,i-k),i]\) 的点作为点对)就行了。如果简单路径过环,直接查也可以处理出计算顺时针走法的答案。

这样就70了

然后我们考虑是不经过重复边的路径,那么我们考虑如何判断两点之间简单路径能否经过环,其实也就两种情况:

  1. 两个点分属环上不同点的子树里
  2. 两个点在环上同一点的子树里,但其LCA是这个点。

所以不妨设 \(top_u\) 为点 \(u\) 一直向上走,走到环上点的前一个点的编号(亦或者说是环上点的子树)。这个可以通过枚举环上点及其子树预处理出来。

那么 \(top_u\neq top_v\) 就是两个点之间简单路径可以路过环的充要条件。

不妨设整个环的边权异或和为 \(t\),则对于逆时针走环的情况,我们只需要对所有 \(top_j\neq top_i\)\(j\),求 \(dis_j\oplus dis_i\oplus t\) 的最大值。

这个偏序关系仅仅只是一个不等关系,考虑在Trie上时,我们只是需要判断是否可以走那一棵子树。所以我们只在乎那颗子树里是否有点,满足其 \(top\) 不等于 \(top_i\),且编号 \(\ge i-k\)

这个问题不用想得太复杂,我们对于Trie上,维护两个二元组 \((top,id)\)。要求两个 \(top\) 不相同,且 \(id\) 尽量小。

意思就是第一个二元组记录该子树里,出现时间最晚的点的 \(top\) 值以及出现时间。

第二个二元组记录该子树里,\(top\) 不同的出现时间最晚的点的 \(top\) 值以及出现时间。

这样查询就行了。

但是需要特判一下Trie里是否有合法解。

code

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

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

相关文章

基于CFX的小型风电机组流场计算流程

一、WOrkbench界面框架二、Geometry模块操作 1.打开Geometry模块,导入txt格式模型File >> Import External Geometry File2.绘制圆柱体作为风轮旋转域3.绘制长方体作为流场计算域4.根据模型与计算条件,做了旋转,根据实际情况选择和操作5.布尔运算第1步:计算域 — (旋…

基于CFX的小型风电机组流程计算流程

一、WOrkbench界面框架二、Geometry模块操作 1.打开Geometry模块,导入txt格式模型File >> Import External Geometry File2.绘制圆柱体作为风轮旋转域3.绘制长方体作为流场计算域4.根据模型与计算条件,做了旋转,根据实际情况选择和操作5.布尔运算第1步:计算域 — (旋…

初始C++

1.visual studio2022 创建项目以及创建C++文件完成上述步骤之后我们就可以敲代码了!!2.关于编译和链接 1.ctrl+F7 对当前C++文件进行编译 并会在编译成功后生成.obj文件。 2.F5 运行整个项目 就会将一个项目下的所有 C++文件进行编译 再将编译后生成的.obj文件链接起来生成 一…

Mysql 8.4 安装(Centos7.9)

前置准备root 环境下执行# 关闭selinux vi /etc/selinux/config # SELINUX=enforcing =>SELINUX=disabled # 开通防火墙3306/tcp firewall-cmd --permanent --add-port=3306/tcp下载链接获取https://dev.mysql.com/downloads/file/?id=529414下载&安装 下载 mkdir -p …

工具|--LINQPad|--使用DnSpy调试LINQPad

前言LINQPad本身就有调试功能, 使用dnSpy调试LINQPad的代码, 岂不是多此一举 ? 其实主要是为了使用dnSpy调试LINQPad中使用到依赖dll的的底层代码, 比如, 在LINQPad中使用到了WPF的dll, 使用dnSpy就可以调试到WPF的一些底层代码.并且, 我尝试过, 直接使用dnSpy加载LINQPad生成…

字符串函数库的经典使用学习

<?php// 1.单引号定义字符串// 2.双引号定义字符串// 3.定界符定义字符串// 1.单引号定义字符串// echo this is my mother;echo this is \my\ mother <br>;// 单引号不能解析转义符\n 换行 \t 缩进echo this \n is a simple \t string<br>;$username = admin;…

解密Prompt系列33. LLM之图表理解任务-多模态篇

这一章我们聚焦多模态图表数据。先讨论下单纯使用prompt的情况下,图片和文字模态哪种表格模型理解的效果更好更好,再说下和表格相关的图表理解任务的微调方案上一章我们介绍了纯文本模态的表格理解任务,这一章我们聚焦多模态图表数据。先讨论下单纯使用prompt的情况下,图片…

用StabilityMatrix一键安装Stable Diffusion

Stable Diffusion是2022年发布的深度学习文字到图像生成模型,它既能免费使用,又能部署在本地端,又有非常多的模型可以直接套用,在使用体验上比Midjourney和DALL-E更加强大。Stable Diffusion使用的模型有下列几大类,对照模型网站 https://civitai.com 以形成更直观的认识:…

「代码随想录算法训练营」第四天 | 链表 part2

24.两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/ 题目难度:中等 文章讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#算法公开课 视频讲解: https://www.bilibili.com/video/BV1YT411g7br 题目状态:有思路,但细节…

【0基础学爬虫】爬虫框架之 feapder 的使用

前言 大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫。 学习爬虫的过程中,一…

PTA题目集7-8的总结

PTA题目集7-8的总结 1.前言: 2.设计与分析: 3.踩坑心得: 4.改进意见: 5.总结 1.前言:PTA题目集7新增了互斥开关,窗帘,多并联电路和多串联电路。由于之前的输入信息中设备的引脚没有作用,所以我的正则表达式只用来提取设备的名字。而互斥开关有三个引脚,不同引脚的电压…

pycharm 动态绘图

_tkinter.TclError: Cant find a usable init.tcl in the following directories:解决办法: 1 打开报错地址所在文件 D:/Program Files/METACOMP/mlib/tcltk8/lib/tcl8.4/init.tcl: version conflict for package "Tcl": have 8.6.9, need exactly 8.4 2 修改init.t…