2019 Multi-University Training Contest 6

本文深入探讨了五道编程竞赛题目,包括最长上升子序列、资源分配、目标定位、互素数查找及小根堆博弈策略,提供了详细的解题思路与算法实现,适合竞赛编程爱好者学习。

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

原来我不仅不会的题多,会写的也写得慢…

1002 Nonsense Time

题意

给出一个 n(n≤5×104)n(n\le 5\times 10^4)n(n5×104)的排列,一开始所有数字是不可用的,第 iii 个时刻解锁 pip_ipi 位置上面的数字,输出 nnn 个数字,表示在第 iii 个时刻,所有已解锁的数字的最长上升子序列长度。
重点:数据保证是随机生成的

题解

数据是随机的,那么一个排列期望的LIS长度在O(n)O(\sqrt n)O(n)级别的,这个结论是我暴力跑出来的。
倒着做,先求出整个排列的LIS,并记录下其中一种LIS的方案,然后按时间去掉点,这个点正好在LIS上的概率是1n\frac{1}{\sqrt n}n1的,那么此时就对当前数列重新跑一边LIS,否则答案不变。
这里我的LIS求方案挂了很多次,用了一些Naive的方法,这里写一下正确的弄法:
每次加入一个点,都记录它是从哪转移过来的,最后从 DP[len]DP[len]DP[len] 搜索方案。
要去掉 nnn 个点,期望重做LIS n\sqrt nn 次,一次LIS是 O(nlogn)O(nlogn)O(nlogn) 的,那么期望总复杂度就是O(nn logn)O(n\sqrt n\ logn)O(nn logn)

1004 Speed Dog

题意

这标题是提速狗?
给出 n(n≤250000)n(n\le 250000)n(n250000)ai, bi(1≤ai,bi≤1000)a_i,\ b_i(1\le a_i, b_i\le 1000)ai, bi(1ai,bi1000),每一对ai, bia_i,\ b_iai, bi都可以自行选择一个0≤xi≤10\le x_i\le 10xi1
A=∑i=1nai×xi, B=∑i=1nai×(1−xi)A = \sum_{i=1}^n a_i\times x_i,\ B= \sum_{i=1}^n a_i\times (1-x_i)A=i=1nai×xi, B=i=1nai×(1xi)
输出nnn个分数,表示当n=in=in=i时,能使max(A,B)max(A,B)max(A,B)的最小值。

题解

先说jls的做法吧,贪心,将 aibi\frac{a_i}{b_i}biai 排个序,小的全给A,大的全给B,只留中间一个,按照最优策略分配。
那么可以维护一个大根堆,表示A选好的,一个小根堆,表示B选好的。
每次加入一个物品,先简单地把它加入其中一个堆,之后再通过调整恢复到一开始的最优策略。
ai, bia_i,\ biai, bi都很小,调整次数可以认为很少,所以复杂度能够接受。

1005 Snowy Smile

题意

队友写得,看都没看

1006 Faraway

题意

n(n≤10)n(n\le 10)n(n10)个士兵,给出边界m (m≤109)m\ (m\le10^9)m (m109),他们有一个共同的目标点(xe, ye) (0≤xe, ye≤m≤109)(x_e,\ y_e)\ (0\le x_e,\ y_e\le m\le10^9)(xe, ye) (0xe, yem109)
告诉你每个人的坐标xi, yi (0≤xe, ye≤m)x_i,\ y_i\ (0\le x_e,\ y_e\le m)xi, yi (0xe, yem),以及一个ki(2≤ki≤5)k_i(2\le k_i\le5)ki(2ki5)和一个ti(0≤ti&lt;ki)t_i(0\le t_i&lt;k_i)ti(0ti<ki),表示这个士兵到目标点的
曼哈顿距离mod ki=timod\ k_i= t_imod ki=ti
求有多少个点是可能的目标点。

题解

每个士兵作为一个坐标原点建立直角坐标系,那么当目标点处于它的四个象限时,计算曼哈顿距离的式子是不同的。
那么这 nnn 个点可以将平面划分为 n2n^2n2 块矩形区域,可以确定每个区域内的点对这 nnn 个点计算曼哈顿距离的式子,那么每个士兵都可以确定一个关系,那就是当 xe % kix_e\ \%\ kixe % ki确定时,ye % kiy_e\ \%\ kiye % ki也可以确定,那么对于每个区域,枚举点的 xxx 值分别对2, 3, 4, 52,\ 3,\ 4,\ 52, 3, 4, 5的取模情况,统计方案数,再对这 nnn 个士兵进行判定,确定 yyy 值对2, 3, 4, 52,\ 3,\ 4,\ 52, 3, 4, 5的取值情况,计算出方案数,更新答案即可。
区域数量是n2n^2n2个,枚举取模情况是O(60)O(60)O(60)的,统计方案数是每个区域均摊O(60)O(60)O(60)的,每次确定一对x, yx,\ yx, y关系是O(n)O(n)O(n)的,所以总复杂度O(n3×120)O(n^3\times 120)O(n3×120)

1008 TDL

题意

定义f(n,m)f(n, m)f(n,m)表示大于 nnn 且和 nnn 互素的第 m(1≤m≤100)m(1\le m\le100)m(1m100) 个数。给出一个k (1≤k≤1018)k\ (1\le k\le 10^{18})k (1k1018),求最小的一个 nnn 满足
(f(n, m)−n) xor n=k(f(n,\ m)-n)\ xor\ n=k(f(n, m)n) xor n=k

题解

互素的关系很好找,我和zsd简单推测,在101810^{18}1018内枚举2000个数字即可找到100个互素的数字(后来sqy打表发现最大值为600+)。
不妨枚举这个(f(n, m)−n)(f(n,\ m)-n)(f(n, m)n),根据推测,枚举上限依然定为2000,那么可以根据上面等式算出此时 nnn 的值,之后再简单判断一下nnn加上我的枚举值是不是真的互素,通过测试后再暴力找f(n, m)f(n,\ m)f(n, m),之后取一个最小的合法的nnn即可。
若枚举上界为 ppp ,那么复杂度为大致O(p2log(k))O(p^2log(k))O(p2log(k))

1012 Stay Real

题意

给你一个规模为 n (n≤105)n\ (n\le 10^5)n (n105)的小根堆,两个人轮流从叶子节点取走数字,每个人都希望自己取出的数字和最大,求最终两个人分别取得的数字和。

题解

根据小根堆的性质,你如果取出了最大值,那么次大值此时一定是可取的,所以最优策略就是取当前最大值。
从大到小排个序,先手取奇后收取偶即可。

补题

  • 1002
  • 1004
  • 1006
  • 1008
  • 1012

看题

1001
1003
1005
1007
1009
1010
1011

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值