2021.2.3 WC模拟赛

2021.2.3 WC模拟赛

状态极差,整场比赛没什么想法,最后只写了最水的暴力。。

T1—far

题意:求所有n个点的有标号无向连通图中,1与 n 的最短路长度之和。

考虑将1与所有点最短距离和求出再除以 n-1。这样就方便DP了。

求最短距离考虑 BFS分层图。

容易想到设 f i , j , k \large f_{i,j,k} fi,j,k 为已选 i 个点、有 k 层、最后一层有 j 个点的方案数。 O ( n 4 ) O(n^4) O(n4)

注意到转移时 层数与方案数的计算无关,可以舍掉这一维。怎么计算贡献?多记一个 g i , j g_{i,j} gi,j 表示 已选 i 个点、最后一层有 j 个点的贡献和(包括已确定点的距离和 以及未确定点至少会有的k层的距离—边转移边补贡献)。

“不要想太多复杂算法,简化问题也是重要一招!

T2—world

题意:有个 n × m n\times m n×m 的 01矩阵,问是否可以通过翻转 一列、一行、一条斜率为1的直线、斜率为-1的直线 使得矩阵全为0。

题型:异或与构造。

暴力:0/1异或相当于模2意义下的整数加法—由每个点的0/1状态可以列出一个4元齐次方程,高斯消元判断是否有解。

题解:每个 2 × 2 2\times 2 2×2 的小正方形的异或可以得到四条斜线翻转次数的异或,可以推知两两斜线之间的异或值,枚举几条斜线就可以推知全部。同理 2 × 2 2\times 2 2×2 的菱形的异或可以得到四条水平竖直线的异或。枚举判断。

爆标:显然 n 或者 m 不超过3时,矩阵一定合法。

4 × 4 4\times 4 4×4 的正方形的每条边中间两个位置 共8个位置为1组,那么每一组的异或应为0,才合法;因为不论怎么翻转,一组总有2个被翻转,异或不变。这个会是充分条件吗?即我们要证明“当每一组的异或都为0时,矩阵一定有方式可以调整为全0矩阵”。

从如何利用条件出发—发现如果一组8个位置已有6个为0时,剩余两个位置颜色相同—1.考虑左上处已有一个 4 × 4 4\times 4 4×4 的0矩阵,考虑扩展一圈,一条边上 发现除了角上的位置 颜色都相同,可以一次调整为0,而角上的颜色可通过斜线随便调整。2.考虑左上角已有一个 5 × 5 5\times 5 5×5 的直角三角形,再扩展一条斜线区域,发现除了两端各两个点颜色相同 一次调整,两端亦可随便调整。

“整体全局难考虑,局部特殊有玄机!

T3—milkyway

题意:有一颗n个点的树,求对点任意分配一个非负权值,使权值和为m,求所有分配情况中的标号最小的带权重心的和。

m为奇数:重心唯一,考虑重心为 i 的方案数。但确定重心的方案数不好求,就可以利用 “等于k”由“小于等于k”差分得到 的思路,通过求重心在边的其中一侧的方案数再“差分”。发现这个方案数只与那一侧的点数s有关 (枚举分配到一侧的权值和):
= ∑ i = ( m + 1 ) / 2 m ( i + s − 1 s − 1 ) ⋅ ( m − i + n − s − 1 n − s − 1 ) \large =\sum_{i=(m+1)/2}^m \binom{i+s-1}{s-1}\cdot\binom{m-i+n-s-1}{n-s-1} =i=(m+1)/2m(s1i+s1)(ns1mi+ns1)
考虑另一种组合意义—枚举中间的小球在哪个位置:
= ∑ i = 1 s ( m / 2 + i − 1 i − 1 ) ⋅ ( m / 2 + ( n − i + 1 ) − 1 ( n − i + 1 ) − 1 ) \large =\sum_{i=1}^s\binom{m/2+i-1}{i-1}\cdot \binom{m/2+(n-i+1)-1}{(n-i+1)-1} =i=1s(i1m/2+i1)((ni+1)1m/2+(ni+1)1)
这样里面与s无关,就可以前缀和求解了。

m为偶数:重心有可能在一条链上,用上述方法会算重,考虑如何去重----重复的即重心有多个的情况,需减去除链上最小标号的其他标号和。

注意到这样的链上 所有伸出去的边上点权都为0,即只有两端的两棵子树有权。考虑用点分治 合并这样的两端的贡献—两端方案数乘上两条链上最小值。用数据结构维护可以做到 O ( n log ⁡ 2 n ) O(n\log^2n) O(nlog2n) 。瓶颈在于最小值的维护,发现只要从小到大枚举点给子树未标记点一个个标记并计算贡献即可,这样的方式直接得到了链上的最小值、且每个点都只遍历了一遍 O ( n log ⁡ n ) O(n\log n) O(nlogn)

“一类问题有一类处理方法,积累、运用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值