2019 Multi-University Training Contest 4

本文精选了多个算法竞赛题目,包括最小生成树、石头分配、好数字等,详细解析了题目的意思及解题思路,提供了高效算法实现,如O(n)、O(nlogn)等,帮助读者深入理解算法原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我后期怎么就这么菜呢…

1001 AND Minimum Spanning Tree

题意

n (n≤2×105)n\ (n\le 2\times 10^5)n (n2×105)个点,第 iii 个点的权值为 iii ,每两个点之间都存在一条权值为两个点异或和大小的边,求一颗最小生成树。

题解

除了111,每个数字都找到自己二进制下从小到大第一位 000,若这是第 iii 位,那么这个数字和 2i2^i2i 异或和为 000 ,连边即可。这样找到的数字一定比自己小,除了2i−12^i-12i1需要特殊处理,这类数字直接连到 2i2^i2i 上,如果不存在,就只好连在1上面,形成 111 的权值。
O(n)O(n)O(n)

1003 Divide the Stones

题意

n (n≤105)n\ (n\le 10^5)n (n105)个石头,第 iii 个石头的重量为 iii ,要求分为k (k≤n)k\ (k\le n)k (kn)组,保证 kkknnn 的一个约数,那么每组正好n/kn/kn/k个。这kkk组石头的重量全部相同,给出一种合法方案,无解输出"no"。

题解

首先对所有石头求一个重量和,如果不能均分,那么直接无解。
特判一下k=1k=1k=1k=nk=nk=n
n/kn/kn/k是偶数的时候,直接蛇形地分配就行了,但如果是奇数,最后333行的分配需要特殊处理。
此时可以证得 kkk 一定为奇数,若 kkk 为偶数,此时 n/kn/kn/k 为奇数,那么nnn一定是一个偶数,那么此时n(n+1)2k\frac {n(n+1)}{2k}2kn(n+1)一定不是整数,这种情况我们第一步就会排除掉。
加入最后一列时,方案是合法的,把倒数第二列分两部分进行如下两两交换,再计算偏差。

原数列交换后偏差值
13-2
220
312
45-1
541

最后一列刚刚好可以对应上这些偏差,这样就OK了。
算法复杂度O(n)O(n)O(n)

1005 Good Numbers

题意

对于一个数字,如果在8进制下,每个数位上出现的数字,都在整个数字上出现了3的倍数次,且它本身是一个P(P&lt;8)P(P &lt; 8)P(P<8)的倍数,那么这是一个合法的数字,求8进制下数位长度不超过K(K≤1018)K(K\le 10^{18})K(K1018)的合法数字的个数。

题解

完全听不懂dls说的啥= =

1006 Horse

题意

有一匹马,要跨过n (n≤104)n\ (n\le 10^4)n (n104)棵树,每棵树具有一个高度 hih_ihi
马的初始体力为 000,每跨过一棵树,体力下降 hih_ihi (体力可以为负数),此时将当前体力值加入答案总和。
但是马有K(0≤K≤min(50,n−1))K (0\le K \le min (50, n - 1))K(0Kmin(50,n1)) 次吃树机会,和M(0≤M≤min(50,n))M (0 \le M \le min (50, n))M(0Mmin(50,n))次恢复机会。
吃树机会可在每次跨越前使用,时候后这棵树被马吃掉,高度 hih_ihi 变为 000
恢复机会在跨越后且体力值结算后时候,将体力值恢复到之前所有吃树的高度之和
求这匹马能获得的最大答案。

题解

吃掉一棵树,那么之后每一次结算都不会受到这次体力值下降的影响,可以认为收益为hi×(n−i+1)h_i\times (n-i+1)hi×(ni+1)
那么对于吃树操作,问题变成选出 KKK 棵树,使得∑hi×(n−i+1)\sum h_i\times (n-i+1)hi×(ni+1)最大。
恢复操作,可以清空直到上次恢复这段区间内每次跨越带来的体力值下降的影响。
问题转化成,把数列分为 MMM 个区间,每个区间内求一个答案,使得总的答案最小。
把上面两个问题分别解出来加和即可。
第一个问题求前K大,排个序就OK了,O(nlogn)O(nlogn)O(nlogn)够用了。
第二个问题就需要DP求解,DP[i][j]DP[i][j]DP[i][j]表示前 iii 个数字被分成 jjj 个区间的最小值,每次转移用斜率优化控制到O(1)O(1)O(1)。那么整体复杂度就是O(nM)O(nM)O(nM)的了。

1007 Just an Old Puzzle

题意

给出10510^5105组15数码问题,分别求它们在120步内是否有解。

题解

120步非常多了,等于说是在判断是否有解。
8数码,15数码和魔方这些模型都是类似的,它们拥有很多种状态,但是这些状态并非互通的,而是大体上被分为了几个连通块,那么就需要一个判断的好方法了。
在15数码问题中,对当前情况求逆序对个数(包括空位0),然后加上空位0到右下角的曼哈顿距离,得到的和奇偶性相同的状态互通。
复杂度O(162)O(16^2)O(162)

1008 K-th Closest Distance

题意

给出长度为nnn的一个数列,以及mmm个询问(1≤n,m≤105)(1 \le n,m\le 10^5)(1n,m105)。每次询问一个区间[l,r][l,r][l,r] 以及p,Kp,Kp,K,求这个区间内第 KKK 个在数值上接近 ppp 的数字是多少,询问强制在线。

题解

每次询问二分数字大小,主席树查找数字的数量就完了。

1010 Minimal Power of Prime

题意

给你一个数字n(n≤1018)n (n\le 10^{18})n(n1018),对这个数字进行质因数分解后,所有质因子中,它对应nnn最小的次幂是多少。

题解

nnn 对小于10185\sqrt[5]{10^{18}}51018的所有素数分解。如果能够分解完毕,直接返回答案,否则继续判断。
分解不出来任何质因数,则答案上限设为4,否则答案上限则是当前的那个最小次幂和4取一个最小值。
测试剩下这个数字最大能是完全多少次方的数字,用来更新答案即可,最大测试4次方。

补题

  • 1001
  • 1003
  • 1005
  • 1006
  • 1007
  • 1008
  • 1010

看题

1002
1004
1009

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值