2023嘉应计算机大赛决赛题解

A JYU签到题
验证码为10582,输出一个整数 38 ∗ 10582 38*10582 3810582即可
B 输出第二个整数
简单读入三个数 a , b , c a,b,c a,b,c然后输出 b b b即可
C 只因数
具有欺诈性质的题目,可以发现偶质数只有2,故只需要判断 n n n的奇偶性。
D 62
题目数据范围较小,可以直接读入一个long long类型的整数 x x x,然后判断是否是62的倍数,否则将其转化为字符串,然后判断是否存在62。
E 团体程序设计天梯赛
根据题目所给要求模拟即可。
F 刷刷刷
注意到每次粉刷会直接覆盖掉之前的粉刷颜色,且数据范围较小,直接根据 k k k次粉刷操作进行for循环模拟,注意边界条件。
G XCPC比赛
首先计算此时已经获得的分数,如果此时已经达到Au线,则直接结束,否则计算差值k,对于每一道已经满分的题目,显然不可能达成要求。
而对于未满分的题目,判断该 题目满分 - 此时已达到的分数 是否能够 > = k >=k >=k,如果满足输出 k k k即可。
H 排排排
赛时这道题目分值出现了问题,后续想通过加权通过达到20分,发现由于洛谷的问题,难以设置达到20分,在此致歉。
该题目主要考察对STL容器和sort的使用,如果懂得则可以很快做出。由于 a i < = C a_i<=C ai<=C,而我们又需要计数,普通数组存不下,开 C C C的空间可能会爆,此时可以用map充当数组使用。后续直接调用sort重定义排序。
该题如若不想使用map,则可以离散化数组。如果不想用sort,由于该题n只有 1 0 3 10^3 103,故冒泡排序也可通过。
I 展展展
根据题意模拟,以’-‘号为分隔符对题意得情况进行讨论。

判断左右两边是哪种情况时记得判断大小的同时保证都是数字或字母,因为可能会出现连续的’-‘,只单纯比较大小和左右两边非相同类型会出问题。

J 加加加
对于 a < 1 0 4 a<10^4 a<104的时候,我们可以暴力枚举+快速幂求解。
对于 a > = 1 0 4 a>=10^4 a>=104的情况,我们设一个数 x ( x > = 1 0 4 ) x(x>=10^4) x(x>=104),我们假设此时只求一个数 x x x,那么 x b x^b xb可以拆解为 ( k ∗ 1 0 4 + x x ) b (k*10^4+xx)^b (k104+xx)b,此时 x = k ∗ 1 0 4 + x x x=k*10^4+xx x=k104+xx, k k k为正整数,那么由二项式定理,我们可以发现里面只有一项是 ( k ∗ 1 0 4 ) 0 x x b (k*10^4)^0xx^b (k104)0xxb,其他每一项都包括 k ∗ 1 0 4 k*10^4 k104的的倍数,故在 m o d ( 1 0 4 ) mod(10^4) mod(104)下值均为 0 0 0,所以对于 x > = 1 0 4 x>=10^4 x>=104的数,我们只需要计算 x ( m o d ) 1 0 4 x(mod)10^4 x(mod)104下的答案,显然 1 , 1 0 4 + 1 , 2 ∗ 1 0 4 + 1 , . . . , k ∗ 1 0 4 + 1 1,10^4+1,2*10^4+1,...,k*10^4+1 1,104+1,2104+1,...,k104+1答案等价于 1 1 1 [ 2 , 1 0 4 ] [2,10^4] [2,104]也同理,故我们可以算出a里面总共有多少个 [ 1 , 1 0 4 ] [1,10^4] [1,104],然后计算答案,注意边界。
暴力枚举+快速幂没分的基本是数据爆了。
K 晒晒晒
该题解法较多,这里介绍一种优先队列贪心写法。
由于只有一台烘衣机,而显然每秒应该尽可能得让最湿的衣服去用烘衣机烘干,这样一定是最优的。我们考虑证明。假设此时存在两件湿衣服 x , y x,y x,y,并且 x > y x>y x>y,此时自然风干为 a a a,烘衣机烘干为 b b b,对于每一次操作, m a x ( x / ( a + b ) , y / a ) < = m a x ( x / a , y / ( a + b ) ) max(x/(a+b),y/a)<=max(x/a,y/(a+b)) max(x/(a+b),y/a)<=max(x/a,y/(a+b)),即对于每一次操作,我们都是最优解,而局部最优在这道题能推出全局最优。考虑反推证明。
L 挤挤挤
简单的写法,考虑最小生成树,直接跑一遍同时记录跑时的最大值即可
稍微复杂的写法,二分答案 w w w,每次跑DFS或者BFS,对于边权小于等于 w w w的就走,大的就不走,最后判断是否每个点都被走过
M Alice和Bob
赛时有人通过暴力卡了过去得到了满分,出题人数据人水了,后面有空加强数据。
正解应该是考虑单调栈,对于每个操作,不难发现就是单调栈要维护的东西,假设 i < j i<j i<j,且 a i < a j a_i<a_j ai<aj如果此时我在 j j j这个位置,且 i i i这个位置的操作次数记为 f i f_i fi,则 f j = f i + 1 f_j=f_i+1 fj=fi+1,后续判断 f i f_i fi的奇偶性即可。
N 炸炸炸
注意输出格式。
由于数据范围较小,考虑枚举炸的铁路,然后判断是否存在两个连通块。
关于连通块的判断,可以采取DFS或者并查集判断,总的时间复杂度为O(m*m)。
如果数据范围比较大,该如何做?
O 简单的数学题

对于 a x + b ≡ y ( m o d 998244353 ) ax+b≡y(mod998244353) ax+by(mod998244353) ,这个问题显然可以用扩展欧几里得求解。而对于下面的操作,用树状数组维护即可,所以这道题就变成简单的树状数组维护+扩展欧几里得求解的问题。
而我们考虑模数,发现模数是个质数,则我们可以直接用逆元求解。
对于模数固定的同余式子,其实我们大多时候可以不用扩偶,可以考虑求逆元的方式。

P 等等等

Q Passable Paths (hard version)
题意简单就是每次给你一大小为m的点集,判断这些点集是否在一条链上
我们考虑链上的点有何性质,假设此时给你一条链,我们设链上的两个端点分别为x和y,定义 d [ x ] [ y ] d[x][y] d[x][y] x x x y y y的距离,则设链上另一个点 u u u,则如果 u u u在链上,那么就得满足 d [ x ] [ u ] + d [ u ] [ y ] = d [ x ] [ y ] d[x][u]+d[u][y]=d[x][y] d[x][u]+d[u][y]=d[x][y],否则u肯定不在这条链上。
那么现在问题变成如何求出这条链上的两个端点,暴力肯定会超时。那么我们考虑平时树上求最长链的方法,两遍DFS的方法。我们先任找一个点 v v v,找到距离 v v v最远的点,设为 x x x,然后再跑一边求离 x x x最远的点,设为 y y y,此时 ( x , y ) (x,y) (x,y)即为链上两个端点。然后对于点集上的每一个点,判断 d [ x ] [ u ] + d [ u ] [ y ] = d [ x ] [ y ] d[x][u]+d[u][y]=d[x][y] d[x][u]+d[u][y]=d[x][y]是否都成立即可。
对于上述如何找离某个点最远的点,可以先做一遍最近公共祖先(LCA),然后通过LCA快速判断两个点的距离,便可以找出离他最远的点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

first vegetable

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值