牛客练习赛127

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

简要写个题解?

A

给定数组 a,以及常数 k,定义 w(i,j)|aiaj|>k 时候为 max(ai,aj),否则为 min(ai,aj)

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

O(nlogn),可以优化到 O(n)

B

给定一个正整数 N 的质因子分解 (pi,ci)N=i=1npici,给定 d,求 i|Nid。对 109+7 取模。

显然就是

i=1n(j=0cipid·j)

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

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

否则有 S(p,m)=(S(p,m/2)1)×pm/2+S(p,m/2),可以 O(log2m) 计算。

O(nlog2n)

C

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

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

更加形式化一点,对于答案边 (u,v,w),其所有的边 (ui,vi,wi) 若有 wiw,则将其加入 E 中一定不影响答案。

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

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

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

那就是找到第一个 Rci,其 wi 即为答案。找不到就无解。

O((n+q)logn)

D

给定一棵树,最初全为白色,要求将至多 k 个点染为黑色,要求最终白色点对之间距离最大的最小。0k<n2<n1000

显然二分答案。

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

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

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

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

不妨设 fu,i 为在子树 u 内,包含 u,最长链为 i 的合法连通块最大大小。

初始:fu,0=1

转移:fu,max(i,j+1)=max(fu,max(i,j+1),(fu,i+fv,j)[i+j+1mid])

然后所有可行的最大的 fi,j 即为所求。

O(n2logn)

code

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

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

E

结论集合怪。草了。

题面

一个无向完全图,给若干边定向后,满足所有环都不包括有向边。这个限制相当强大。

考虑一个无向连通图的生成树,往中间随便加一条有向边都会形成环。

由此我们可以推出一个推论:

定向后,如果只保留无向边,则所有的连通块全部是完全图

并且,如果将一个连通块缩为一个点,那么这些有向边只会组成一个DAG。而且这个DAG有唯一零入度点和唯一零出度点,且所有点出度加入度为点的个数。

所以我们设 fn 为将大小为 n 的完全图染色的答案,gn 为将大小为 n 的完全图的边染色,且着色后不出现题中所述两种结构的方案数。

则显然可以类比拓扑排序的过程进行DP,也即 fn=j=1n1fnjgj(nj)。我们枚举源点,然后删去源点,就又会有另一个新的源点,是完全相同的问题。

显然如果求出 g,则可以分治NTT求解。不过观察数据范围会知道分治NTT指定TLE。不过化作EGF运算之后也可以变成多项式求逆,单 log 求解,具体操作参见 link

然后另一个离谱的事情就出来了

我们发现 g 相当难求,但是打表之后发现 g7=0。由于 n 的完全图必定包含一个 n1 的完全图,所以必然有 i7,gi=0

这就抽象了。

打表可以求出 g=0,1,2,8,54,548,256,0,0,0。具体的可以二进制枚举每条边的颜色然后暴力check。这样我们就利用了穷举法证明了本结论。(官方说有数学证明,不过目前好像没发)

(刚好算到 7 这个可以打出表的位置,更大的话打表还会炸。。。)

然后直接暴力DP。。

O(n)

我好奇的是出题人是怎么发现这个东西的。

F

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

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

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

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

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

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

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

这样就70了

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

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

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

那么 toputopv 就是两个点之间简单路径可以路过环的充要条件。

不妨设整个环的边权异或和为 t,则对于逆时针走环的情况,我们只需要对所有 topjtopij,求 disjdisit 的最大值。

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

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

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

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

这样查询就行了。

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

code

posted @   spdarkle  阅读(98)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示