浙江财经大学第十四届程序设计竞赛题解

【题面pdf下载】链接: https://pan.baidu.com/s/1Eb16fHtNYMLrRk9QnXWa-g 密码: dwn8

题目牛客网提交链接

【现场赛排名】链接: https://pan.baidu.com/s/1jfzH6-7BoPhEjnijGQK53w 密码: y669

感谢各位大佬的参赛。 
由于命题人水平不高,而且之前没有命题经验,又是第一次把题目放到外网,所以可能会有数据不严谨的情况出现;也有可能出题人对问题理解不深刻,没想到最优解。如果发现了题目中的各种问题,可以在各种ACM QQ群(例如ACFun、ACM贴吧群、牛客网群)进行交流学习,也可以在这个博客留言。  
有做的不好的地方,希望各位大佬多多包涵,批评指正。

Problem A. A Sad Story
先考虑求区间最大值和是最小值的情况:  
证明:满足最大值和是最小值时的多个序列中,必定有一种序列的最大值在序列两端。  
一个序列中拿出其最大值,对剩下的所有数的任意排列中,插入这个最大值。  
当这个最大值排在两端时,原序列区间最大值和加上这最大值。  
当这个最大值不在两端时,原序列区间最大值和加上这最大值,以及加上因这最大值加入而改变的区间最大值的差值(此时区间最大值一定不小于原区间最大值)。  
例子:  
$K$ 为 $3$ 。  
$1$ $5$ $3$ $2$ $4$ 加入 $6$ 。  
$1$ $5$ $3$ $2$ $4$ $6$ 为 $5 + 5 + 4 + 6$  
$1$ $5$ $3$ $2$ $6$ $4$ 为 $5 + 5 + 6 + 6$  
不在两端的最大值多了改变大小的区间最大值 $6 - 4$  
这个结论对任意排列的序列都成立,因此所有区间最大值和是最小值的序列中,存在最大值在序列两端的序列。  
可得:  
当序列为 V 字型时,一定是区间最大值和是最小值。  
同理可得:  
当序列为 Λ 字型时,一定是区间最小值和是最大值。  
综合得:  
当序列为单调序列时,一定是区间最大值减最小值和的最小值。  
单组数据时间复杂度 $O(NlogN)$。

Problem B. Bazinga
如果 $x$ 和 $k$ 互质,那么 $x$ mod $k$ 和 $k$ 也互质。  
以及 $(x + k * 1) * (x + k * 2) * (x + k * 3) * ... * (x + k * p) \equiv x^p$ (mod $k$) 。  
把 $[1, k-1]$ 中与 $k$ 互质的数相乘,得到一个循环节对答案的贡献,再对其在 $[l, r]$ 中出现的次数做快速幂计算。  
再把之前 $[l, r]$ 不在循环节内的数暴力跑一遍乘进答案。  
注意点:

  • $k$ 为 $1$ 时,答案为 $0$。

单组数据时间复杂度 $O(K)$。

Problem C. Collect Jewel
性质1(虽然这个性质对解题好像没啥用):在最优解中,每一个士兵在行走过程中,身上的价值是不可能变负的。  
性质2(虽然这个性质对解题好像也没啥用):在最优解中,一个士兵的路线终点,不可能是另一个士兵路线的起点。  
性质3(虽然这个性质对解题好像又没啥用):派出 $K$ 个士兵一定能得到最优解。

正题:  
这是一个很容易察觉到的最 x 费用最大流问题。  
由于每个节点能获得至多 $1$ 次价值,第二个人再次走过这个节点,就无法获得这个价值,因此需要拆点,每一个节点 $i$ 拆成两个 $2i+1$ 和 $2i+2$,建立如下边 $(2i+1,2i+2,1,V_i)$ 以及 $(2i+1,2i+2,inf,0)$。  
对于原图中每一条有向边 $\left< x,y \right> $,建立如下边 $(2x+2,2y+1,inf,-C_i)$。  
建立超级原点$S$,建立$(S, 2i+1, inf, 0)$。  
建立超级汇点$T$,建立$(2i+2,T,inf,0)$。  
控制一下 $S$ 出去的流量最多为 $K$,跑一个最大费用最大流即可。可以把每条边权取反之后求最小费用最大流,其中最小费用的绝对值就是答案。  
注意:题目中数据范围保证了 $U_i<V_i$ ,因此图是有向无环图,建完图的网络是不存在负环的。  
单组数据时间复杂度 $O(min(K,N)NM)$。

这题如果不保证 $U_i<V_i$,就需要消负圈,如果有大佬会搞,望不吝赐教,看到网上很多都是一句话带过,例如“强制把负圈满流”,zkw 博客好像也没给出代码,还发现了一个题 POJ 2175。

Problem D. Disport with Jelly
可以这样考虑:问题等价于有两堆石头,第一堆有 $K-L$ 个,第二堆有 $R-K$ 个,每人每次可以从任意一堆中取任意个,取走最后一个石头的人算赢。这就是经典的 Nim 取子游戏,看两堆石头异或值即可。由于这里只有两堆石头,也可以判断两堆石头数量是否相等。  
单组数据时间复杂度 $O(1)$。

Problem E. Easygoing Single Tune Circulation
简单地说题意就是,一个字典库有 $N$ 个字符串,每个字符串中无重复字符,每个字符串以输入作为最小周期无限循环。  
有 $Q$ 次询问,每次询问一个字符串是否是 $N$ 个串中其中一个的子串。

由于字典库中每个字符串都是无限循环的,所以对于每个询问的串,也必须是循环的,不循环的就无解。例如[abcd],[aba],[abab]都被认为是循环的,第一个循环节是本身,第二,三两个循环节均为[ab];而[abb],[abcdc]被认为不循环。

也就是说循环节要么没有,要么就是从第 $0$ 个字符开始到第一个出现重复字符的前一个位置结束。(因为 $S_i$ 中无重复字符)

【1】对于每一个询问,我们首先可以判定一下这个询问串是否是字典库中某个串两倍的子串。如果找到就有解。这里可以搞个广义 SAM,每个子串都必然包含在 SAM 的某个状态里。  
【2】如果没有找到,就需要去寻找这次询问的串的循环节是否可以由字典库中某个串通过循环同构得到。可以将每一个 $S_i$ 的最小表示法插入字典树,询问的时候,可以把循环节也转成最小表示法,然后去字典树中找一找。

下面这种做法也放过去了:
把每一个 $S_i$ 及其循环同构的串都插入到字典树中,然后两种都可以查询了。

各种 hash 算法不知道能不能过,造数据的时候卡了少数常见 base 和 mod,然后卡了一些双 hash 超时。

Problem F. Formula One
枚举两辆车 $i$ 和 $j$,计算这两辆车的超车次数。  
两辆车第一次相遇的时候,必然是快车比慢车多开了一圈,依据这个性质,可以计算出辆车第一次相遇的时间。两车相邻两次相遇的时间间隔是不会变的。  
相遇一次超车一次,刚好在停止的时候相遇就不算超车。  
公式 $\left\lfloor \frac { P\times \left| { A }_{ i }-{ A }_{ j } \right| -1 }{ { A }_{ i }\times { A }_{ j } } \right\rfloor$  
其中 $R$ 是可以不用的。  
注意点:

  • 精度问题,最好用整型计算
  • $P$ 时刻刚好相遇不算超车

单组数据时间复杂度 $O(n^2)$。

Problem G. Get the Highest Score
首先有两个贪心思想:

  • 连续的一段 $-1$ 肯定需要填同一种数。
  • 连续的一段 $-1$ 的左边和右边是同一种数字,那么这段 $-1$ 就填那个数。

上述两步填完后,按照题目中的方法压缩数组。  
然后这样考虑:最后肯定有一段数字是相同的,也就是枚举位置 $x$,让 $val[1,n]= max(val[1, x] + (n-x)^2)$ 最大,枚举过程中保证 $[x+1,n]$ 可以变成相同的数字。$val[1, x]$ 的最大值也是如此求解。  
因此从左到右 dp ,记录前缀能获得的最大分数。可以发现,压缩后的数组,最后一段相同的不会超过三小段。  
单组数据时间复杂度 $O(n)$。

Problem H. Hero
按照 $A$ 是小于 $0$,还是等于 $0$,还是大于 $0$,将物品分成三类。  
在同一类中:  
以 $B$ 从小到大排序。先考虑 $B_{x}$ 左边对其的影响,会发现有决策单调性(证明如下),右边用同样的方法处理。  
$B_{i} < B_{j} < B_{y} < B_{x} < B_{z}$  

若 $|A_{i}| \ge |A_{j}|$,$|A_{j}|$ 就可以不考虑,剩下就是单调递增的 $|A|$ 。  
证明:  
当 $B_{x}$ 在 $i$ 取到最优解。  
$|A_{i}|*|A_{x}|*(B_{x}-B_{i})^2 > |A_{j}|*|A_{x}|*(B_{x}-B_{j})^2 $ 得  
$B_{x}-B_{j} < \frac { \left( { B }_{ j }-{ B }_{ i } \right) \times \sqrt { |{ A }_{ i }| } \times \left( \sqrt { |{ A }_{ j }| } +\sqrt { |{ A }_{ i }| } \right) }{ |{ A }_{ j }|-|{ A }_{ i }| } $  
$B_{x}-B_{j} > 0 > \frac { \left( { B }_{ j }-{ B }_{ i } \right) \times \sqrt { |{ A }_{ i }| } \times \left( \sqrt { |{ A }_{ j }| } -\sqrt { |{ A }_{ i }| } \right) }{ |{ A }_{ j }|-|{ A }_{ i }| }$  
$0 < B_{y}-B_{j} < B_{x}-B_{j} < \frac { \left( { B }_{ j }-{ B }_{ i } \right) \times \sqrt { |{ A }_{ i }| } \times \left( \sqrt { |{ A }_{ j }| } +\sqrt { |{ A }_{ i }| } \right) }{ |{ A }_{ j }|-|{ A }_{ i }| } $  
因此 $B_{y}$ 一定不在 $j$ 取到最优解,故 $B_{y}$ 在 $i$ 或之前取到最优解。  
当 $B_{x}$ 在 $j$ 取到最优解。  
$|A_{i}|*|A_{x}|*(B_{x}-B_{i})^2 < |A_{j}|*|A_{x}|*(B_{x}-B_{j})^2 $ 得  
$B_{x}-B_{j} > \frac { \left( { B }_{ j }-{ B }_{ i } \right) \times \sqrt { |{ A }_{ i }| } \times \left( \sqrt { |{ A }_{ j }| } +\sqrt { |{ A }_{ i }| } \right) }{ |{ A }_{ j }|-|{ A }_{ i }| } $  
$B_{x}-B_{j} < \frac { \left( { B }_{ j }-{ B }_{ i } \right) \times \sqrt { |{ A }_{ i }| } \times \left( \sqrt { |{ A }_{ j }| } -\sqrt { |{ A }_{ i }| } \right) }{ |{ A }_{ j }|-|{ A }_{ i }| } < 0$ 不用考虑  
$B_{z}-B_{j} > B_{x}-B_{j} > \frac { \left( { B }_{ j }-{ B }_{ i } \right) \times \sqrt { |{ A }_{ i }| } \times \left( \sqrt { |{ A }_{ j }| } +\sqrt { |{ A }_{ i }| } \right) }{ |{ A }_{ j }|-|{ A }_{ i }| } $  
因此 $B_{z}$ 一定不在 $i$ 取到最优解,故 $B_{z}$ 在 $j$ 或之后取到最优解。  
剩下就用决策单调性就可以来做了。  
单组数据时间复杂度 $O(nlogn)$。

Problem I. Interesting Set
这题思路很直白,先求出 $N$ 是第几个,可以用很多方法求出是第 $P$ 个,然后判断下 $P+K$ 是否存在,存在则求出第 $P+K$ 个是谁。算的时候杨辉三角打个表,算一算方案数这种就可以了,也可以用数位 dp 的思路来做。  
单组数据时间复杂度 $O(64)$。

Problem J. Journey
要求经过每个点恰好一次,每条边恰好一次,只有一条链是满足要求的,也就是只要判断给出的图是否是一条链即可。  
注意点:

  • 一条链加一个简单环的图
  • 一个节点,没有边的图
  • 清空数组用了 memset 会超时

单组数据时间复杂度 $O(n+m)$。

Problem K. Keep Danding
不妨把一个询问拆成两个,计算出区间长度小于等于 $R$ 的方案数,以及小于等于 $L-1$ 的方案数,相减即可得到答案。

下面说明区间长度小于等于 $K$ 的方案数:  
首先预处理出 $f[i]$,表示 $i$ 位置最远能到达 $f[i]$ 位置,保证区间 $[i,f[i]]$ 无重复元素,容易发现 $f[i]$ 是非递减的。  
令 $g[i] = f[i] - i + 1$,表示区间长度。  
对于一次询问,我们可以把 $[L, R]$ 拆成两段来计算方案数。  
$[L, R - K]$: 考虑每一个位置作为区间左端点的方案数,就是求这段区间上 $g[i]$ 小于等于 $K$ 的数字的和,主席树可以单 log 高效求解。线段树上每个节点排个序,每个节点二分这种双 log 做法在现场赛也是允许通过的。  
$[R-K+1, R]$: 这个部分比较经典,二分 $f$ 数组。

Problem L. Limitless Matrix
这题绝对 不 是暴力!  
当 $|K|$ 为素数或 $1$ 或 $0$ 时不可能有解。  
当 $N$ 为 $1$ 时不可能有解。  
当 $N$ 为 $2$ 时,只有 $K$ 为平方数有解, $2 \times 2$ 矩阵每个元素都是 $ \sqrt K$ 。  
当 $N$ 为 $3$ 时,只有 $K$ 为立方数有解(证明如下), $3 \times 3$ 矩阵每个元素都是 $ \sqrt[3] K$ (也可以用其他的方法凑,不过 $ \sqrt[3] K$ 最方便)。  
证明:$N$ 为 $3$ 时情况。  
$\left[ \begin{matrix} a & b & c \\ d & e & f \\ g & h & i \end{matrix} \right] $
$(a \times b \times c) \times (d \times e \times f) \times (g \times h \times i) = K^3 = (a \times e \times i) \times (b \times e \times h) \times (c \times e \times g)$  
$d \times e \times f = e \times e \times e$  
$K$ 为矩阵中间数 $e$ 的立方。  
当 $N > 3$ 时,放心大胆的用 dfs 搜一遍吧。  
先把 $K$ 分解成 $a \times b$ ,此题就变成了在 $N \times N$ 这个矩阵中,填入 $a$ 与 $b$ 使每行每列以及两个对角线上有且只有一个 $a$ 和一个 $b$ ,其余位置填入 $1$ 。  
先枚举 $a$ 与 $b$ 在两个对角线上如何放置,然后逐行枚举 $a$ 应该放哪一列,放完 $a$ 后逐行枚举放 $b$。发现 $N$ 从 $4$ 到 $1000$ 都是相当快的能跑出答案。  
如果有大佬有直接构造的方法,欢迎在 QQ 群里提出。  
这题复杂度 O(不知道)。

Problem M. Magical Water Cup

如果每杯水倒出的量都一样且第一杯水能倒出,则答案为无穷。  
否则,先分别计算出每杯水最多可以倒多少次。  
除了第一杯水,其他的水如果入得比出的多包括等于则可以倒无穷次,否则就是$\left\lfloor \frac { A_{ i } }{ B_{ i }-B_{ i-1 } } \right\rfloor$次。  
第一杯水是先出后入,先判断能否倒出第一次,如果可以就倒出,然后就和另外的水杯一样处理了;否则答案就是 0。  
然后遍历一遍找到次数最小且离第一杯最近的那杯水,它就是最后不能操作的位置。简单计算即可得到答案  
注意点:

  • 第一杯水是先出后入要特判
  • 数据超过int的范围

单组数据时间复杂度 $O(n)$。

---
最后,再次感谢您的参赛,祝您前程似锦、梦想成真。

原文地址:https://www.cnblogs.com/zufezzt/p/8648892.html

时间: 2024-09-30 11:19:56

浙江财经大学第十四届程序设计竞赛题解的相关文章

2016年“计蒜客”杯华中师范大学第十四届程序设计竞赛题解

A. 寻找字符串 对于一个字符串 s,定义一个函数 S(x),表示 s 中有多少个子串 x.现在给定 S(a),S(b),S(ab),S(ba)的值,求满足这 4 个值的字符串 s,如果有多个满足条件的字符串,输出字典序最小的. s 中仅可能含有字符 a 和 b. 任何一个串的 S(ab) 与 S(ba) 的相差都不会超过1.可以分 S(ab)-S(ba) 为 0 -1 1 三种情况讨论.先构造出相应的 ab 相邻的串,再考虑按照字典序最小出要求将剩余的字母插入串中即可. 应该注意,这道问题有很

HDU 6467 简单数学题 【递推公式 &amp;&amp; O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 308    Accepted Submission(s): 150 Problem Description 已知 F(n)=∑i=1n(i×∑j=inCij) 求 F(n) m

(未完成)[HDUOJ]“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛

solved 5 A(签到) 题意:两个人随机得到0或1其中之一数字,每个人都可以猜对方的数字是什么,有一个人猜对就算成功,问最优策略下00,01,10,11四种情况两人的成功概率分别是多少. 题意不明的签到题,题面说两人不能沟通,以为就是两个人随便猜,成功率都是1-0.5*0.5=0.75.结果是两个人可以提前商量好策略,那显然可以其中一个人猜和自己相同的数,另一个人猜和自己不同的数,那么所有的成功率都是100%. #include<bits/stdc++.h> using namespac

广东工业大学第十四届程序设计竞赛 鸽子数

Problem Description 通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长.通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长.通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长.鸽子数字由以下过程定义:从任何正整数开始,将数字替换为其各个数位的平方和,并重复该过程,直到该数字等于1.如果不能,则这个数字不是鸽子数.例如7是鸽子数,因为7->49->97->130->10->1.(7*7=49,4*4+9*9=97,9*9+

长春理工大学第十四届程序设计竞赛(重现赛)J.Printout

链接:https://ac.nowcoder.com/acm/contest/912/J 题意: 小r为了打校赛,他打算去打字社打印一份包含世界上所有算法的模板. 到了打字社,小r一看价格:总打印页数X0X0页以下(不含X0X0)x0x0元每页,X0∼X1X0∼X1页(不含X1X1)x1x1元每页,X1∼X2X1∼X2页(不含X2X2)x2x2元每页,X2∼X3X2∼X3页(不含X3X3)x3x3元每页,X3∼X4X3∼X4页(不含X4X4)x4x4元每页…… 小r转念一想,他可以多放一些白纸在

长春理工大学第十四届程序设计竞赛(重现赛)M.Orx Zone

链接:https://ac.nowcoder.com/acm/contest/912/M 题意: Daenerys Stormborn, 风暴中出生的丹尼莉丝,the Unburnt, 烧不死的,Queen of Meereen, 弥林女王,Queen of the Andals and the Rhoynar and the First Men, 安达尔人,罗伊那人,和先民的女王,Lord of the Seven Kingdoms, 七国之主,Protector of the Realm,

长春理工大学第十四届程序设计竞赛(重现赛)B

B Bowling Game 题目链接:https://ac.nowcoder.com/acm/contest/912/B 题目 CUST的队员打完省赛后,小r带着大家去打保龄球. 保龄球是一项难度非常高的游戏,然而这根本难不住校队成员,他们个个都很厉害(炸和)一发10个瓶都倒.尤其是小r,每次都能闭着眼睛一次扔倒10个瓶.他们当中也有一个并不那么厉害的下水道玩家,每次都能把球丢进下水道里,导致一个球瓶都砸不中. 几轮下来,我们发现回来的球越来越少,最后只剩几个9号球了.他们不爱丢9号球,因为太

长春理工大学第十四届程序设计竞赛(重现赛)H

H .Arithmetic Sequence 题目链接:https://ac.nowcoder.com/acm/contest/912/H 题目 数竞选手小r最喜欢做的题型是数列大题,并且每一道都能得到满分. 你可能不相信,但其实他发现了一个结论:只要是数列,无论是给了通项还是给了递推式,无论定义多复杂,都可以被搞成等差数列.这样,只要他精通了等差数列,他就能做出任何数列题目. 等差数列是数列的一种.在等差数列中,任何相邻两项的差相等,该差值称为公差.例如数列3,5,7,9,11,13,?就是一

长春理工大学第十四届程序设计竞赛(重现赛)F

F. Successione di Fixoracci 题目链接:https://ac.nowcoder.com/acm/contest/912/F 题目: 动态规划(Dynamic programming,简称dp)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法.例如,假设小x一步能爬1层或2层台阶,求小x爬n层台阶共有几种方法,就可以用dp计算:设Fi代表小x爬i层台阶共有几种方法,则Fi=Fi−1+Fi−2. 小x是练习时长两年半的acm练习生,喜欢口胡.dp.线段树.妙