SGU150-159 Solution

更好的阅读体验戳此进入

题面链接

150. Mr. Beetle II

题面

给定平面直角坐标系中的起点坐标 (x1,y1),和终点坐标 (x2,y2),求起点到终点构成线段穿过的第 n 个格子左下角的坐标(格子的边界和角点不算做格子)。无解输出 no solution

1n400,|x|,|y|106

输入格式

x1,y1,x2,y2,n

Examples

Input_1

Output_1

Solution

难度不高,但细节颇多。

不难想到数据范围较小,可以枚举区间内的所有横坐标,然后通过斜率和分类讨论计算横坐标对应的纵坐标的数量和范围,找到对应的方格即可。同时不难想到若 x1=x2y1=y2 则无解,经过方格数不足 n 亦无解。同时需要考虑好 x1,x2 的大小关系,以确定枚举方向,思路很显然但实现细节颇多。

Code

151. Construct a triangle

题面

对于 ABC,令 MAB 中点,令 |AB|=c,|AC|=b,|AM|=m。给定实数 c,b,m,构造该三角形,输出 A,B,C 的坐标,以浮点数形式输出,每个数的绝对值不超过 104,输出小数点后 5 位,若无解输出 Mission impossible

特别地,对于本题的数据,允许 A,B,C 三点共线,即若你构造的三个点共线仍算作一组解。

0<c,b,m<103

Examples

Input_1

Output_1

Solution

首先不难想到该三角形可以任意平移,所以考虑固定点 A 在原点。不难发现三角形可以任意绕 A 旋转,所以可以再任意固定一个点的一个坐标,则不失一般性,可以设 B(0,c),C(x,y),即 M(x2,y+c2),则有方程:

x2+y2=b2x24+(y+c)24=m2

不难发现方程非线性,可解,仅需额外判断是否有解即可。

仍需注意一个额外的细节,判断无解时需要和 eps 判断,且若误差范围内为 0 需要强制设为 0,否则可能输出 0.00000,额外还需要注意判断需要在最后开方之前判断是否误差范围内为 0,否则会出现对负数开方导致答案变得奇怪。

Code

152. Making round

题面

给定序列 An 表示 n 个人的选票情况,现你需要将其选票转化为百分制并输出百分制的整数部分,换言之即转换后的所有数之和恰好为 100,转换时可以独立任意选择向上取整或向下取整,输出转换后的序列。无解输出 No solution

1n,ai104

Examples

Input_1

Output_1

Solution

钦定均为向下取整,令钦定后的和为 tot,计算一下有多少数转化后有余数,然后将有余数的数分配 100tot 个改为向上取整即可,不足即为无解。

Code

153. Playing with matches

题面

存在 n 根火柴,两人轮流取,每次可以取 1,P1,P2,,Pm 根火柴,将火柴全部取完者输,若先手必胜输出 FIRST PLAYER MUST WIN,后手必胜输出 SECOND PLAYER MUST WIN。存在 T 组数据。

1n109,2Pi9,0m8。(原题中未对 T 做出限制,理论上 1s 内可以通过 T102

Examples

Input_1

Output_1

Solution

一道挺好的博弈论的题。

对于这种类型题不难想到 SG 函数解决,且由于本题仅有一堆石子,以及后面我们需要求循环节,则无需记录 SG 的具体值,仅需记录是否不为 0。显然存在 SG(0)=true,即空集时必胜。我们假设 P0=1,不难想到转移:

SG(i)=j=0m(SG(iPj)true)

转移显然,即考虑是否所有子状态均为必胜,是则此状态必输,反之必胜。

发现这个的复杂度是 O(Tnm) 的无法通过,则发现由于 Pi9,则对于一个 SG(i) 最多由其之前九个数决定,由于 SG 为布尔类型则最多有 2Pi=512 种状态,所以最多经过 512 个数后将会出现重复状态,即进入循环,故得证 SG 存在长度最多为 512 的循环节,则可以通过枚举每一个长度并验证证明,同时可以证明循环节一定从 0 开始,证明未知,在论文 GAME Theory Thomas S Ferguson (University of California at Los Angeles) 种 1.4 Subtraction Games. 亦提及了此现象,但似乎并未对该现象进行证明。于是最终复杂度 O(T22Pi),可以通过。

Code

154. Factorial

题面

给定 Q,求最小的自然数 N 满足 N! 的结尾有 Q0。无解输出 No solution

0Q108

Examples

Input_1

Output_1

Solution

简单数论,经典套路。

显然从式子里拆出来 25 的数量取个 min 即可,且显然阶乘中 5 会比 2 多,故只需要记录 5 的数量即可。

显然 n 单调,则二分答案 n,对于 n 的上界可以无脑一些,不妨设为 5×108,此时显然存在远大于 1085

具体式子显然为:

in5i

注意:需要特判 Q=0 的情况。(否则会卡在第三个点,这个东西我调了半天)

Code

155. Cartesian Tree

题面

给定 n 个键值二元组,要求以这些键值作为映射构造一棵笛卡尔树。即 value 满足小根堆性质的 key 的二叉搜索树。数据满足 key 互不相同且 value 互不相同。

1n5×104,|ki|,|ai|3×104

Examples

Input_1

Output_1

Solution

笛卡尔树模板,处理好各种映射之间的关系即可。

Code

156. Strange Graph

题面

给定 n 个点 m 条边的无向图,保证对于其中任意一个点 v 满足以下性质:

你需要判断该图是否存在哈密尔顿回路,若存在则输出任意一个,反之输出 -1

Examples

Input_1

Output_1

Input_2

Output_2

Solution

一道十分高妙的题,思路不难但是构造方案还是需要亿些细节的。

首先根据题意,若 degv>2,则 N(v)/u 为完全图,即一定符合构造哈密尔顿回路的条件,即任意两个节点的度数和不小于 n。于是可以考虑将 N(v)/u 缩点。显然缩点之后的点之间只会被一些度数为 2 的点相连,此时我们每经过一条边就会经过一个新的点,则可以将问题转化为在新图中找欧拉回路,这样的话存在性显然,仅需判断新图中是否所有点的度数均为偶数即可。但是方案就难以构造了。

如果按照一般的构造欧拉回路的思路,我们会发现将欧拉回路还原回哈密尔顿回路是复杂的,因为我们是需要考虑缩完的两个点之间的边在原图中是哪些点,似乎可以维护但极为复杂,细节过多,所以这里有一个特别高妙的做法。

可以参考代码中 SetAns 函数,如此实现是可以保证,对于缩点后的没有连向其它新图中的点的旧点,当遍历到其之后就不会接着遍历,然后直接记录,反之则会继续找到新的点。可以画个图理解一下,这个思路确实很巧妙。

Tips:网上有的题解写法是直接判断原图中的度数是否均为偶数,我认为这个是错误的,反例易得,但是似乎可以通过?

Code

157. Patience

题面

Patience 游戏。存在有序的 14 个空位,和 1K13 张牌,将 A 放到第 1 个格子上,第 2 个空位留空,剩下的牌随机排列放到 314 格子中。然后你可以进行若干次操作,每次可以将空位前的牌 +1 对应的牌移动到空位上,其原本位置变为空位。若若干次操作后可以将前 13 个空位变为有序的 AK,那么称游戏胜利。给定 n,现在已固定前 14n 个空位是有序合法的,求有多少种序列是有可能胜利的。

1n13

Examples

Input_1

Output_1

Input_2

Output_2

Solution

一个显而易见的思路就是 O(nn!) 枚举并验证,然后打个表即可,时间可能长一点不过也是可以接受的。

Code

题面

 

Solution

 

Code

题面

 

Solution

 

Code

题面

 

Solution

 

Code

题面

 

Solution

 

Code

题面

 

Solution

 

Code

题面

 

Solution

 

Code

UPD

update-2022_12_16 初稿