2022牛客寒假算法基础集训营2

本文介绍了牛客寒假算法基础集训营中的难点题目,涉及图论、大模拟、逆元、并查集、位运算等算法。作者分享了在解决图论问题"小沙的长路"时,如何确定最长和最短路径,并讨论了"小沙的算数"中使用逆元处理除法取模的问题。同时,还分析了"小沙的数数"的位运算解题思路和"小沙的构造"的字符对称性构造方法。文章反思了比赛中遇到的错误和编程技巧的不足。

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

这场难度有所提升,感觉相对上一场思维量和代码量都有所增加,赛中6赛后7,虽然这把排名好看一点,但是wa的太多了,加起来一共wa了13发,呜呜呜。

高光时刻:(别问为什么wa1,因为手抖了,其实差一点抢到k的一血,差了7秒呜呜呜)

 A(补):思维,结论

C:签到+贪心

E:图论,数学

F:大模拟+逆元+并查集,wa5才过心态爆炸

H:位运算+贪心

I:构造+模拟,又wa5,呜呜呜

K:签到

E:小沙的长路

 身为队伍里的图论选手,虽说还没开始重学图论,但这题还是可以做的。

首先考虑最大值,要使得最长路最长,那一定要尽可能多地经过每一条路,因此如果我从一个点出发,一定有一条最长路最后回到这个点(因为完全图每个点度数至少为2,要想全部经过至少我这个出发点的几条要尽量都经过),那问题就变成给一个完全图删边能构成的最长欧拉回路问题,欧拉回路有一个定理:能构成欧拉回路的充要条件是这个图中最多有两个奇数度的点或者都是偶数度的点,所以当n为奇数时本身就存在欧拉回路,当n为偶数时,我们想办法去掉尽可能少的边使这个图只有两个奇数度的点,这个很好想,去掉一条边可以使两个结点的度数变成偶数,最后要剩下两个所以一共要去掉n/2-1条边。

再考虑最小值,这个我和出题人思路貌似不太一样:

我的想法:

要使最长路最短,感性地先找一条看起来比较符合答案的就是我选定一个起点(入度为0)和终点(出度为0),让所有的边都指向终点,即从起点bfs染边,这样最长路长度为n-1,那还有没有更小地呢?要使最长度更短,在上图地基础上能想到地操作就是让这个最长路少走一个点(上面最长路是经过了每一个点地),我们使和终点直接相连的边反向,但是这样一来这个终点就相当于变成了一个起点,然后图上又会出现一个新的终点,又回到了初始状态,所以这条最长路不可能再缩短了。嘛,我这个不太严谨,但是题解这个我不太能理解,呜呜呜。

题解:

### 关于2020年寒假算法基础集训营中的欧几里得算法2020年的寒假算法基础集训营中,确实存在涉及欧几里得算法的相关题目。具体来说,在第四场竞赛的第一题即为“A. 欧几里得”,该题目的核心在于利用扩展欧几里得定理来解决问题[^5]。 #### 扩展欧几里得算法简介 扩展欧几里得算法主要用于求解形如 ax + by = gcd(a, b) 的线性不定方程的一组特解(x,y),其中gcd表示最大公约数。此方法不仅能够计算两个整数的最大公因数,还能找到满足上述条件的具体系数x和y。 对于给定的数据范围较小的情况可以直接通过递归来实现;而对于较大数据则需考虑效率优化问题。下面给出了一段基于C++语言编写的用于解决此类问题的模板代码: ```cpp #include<bits/stdc++.h> #define int long long using namespace std; // 定义全局变量存储结果 int x, y; void ex_gcd(int a, int b){ if(b == 0){ x = 1; y = 0; return ; } ex_gcd(b, a % b); int tmp = x; x = y; y = tmp - (a / b) * y; } ``` 这段程序实现了经典的扩展欧几里得算法逻辑,并且可以作为处理类似问题的基础工具函数调用。 #### 实际应用案例分析 回到原题本身,“A. 欧几里得”的解答思路就是先预处理斐波那契数列前若干项数值存入数组`a[]`内以便快速查询,之后针对每一次询问直接输出对应位置处两相邻元素之和即可得出最终答案。这实际上巧妙运用到了广为人知的裴蜀定理——任意一对互质正整数都可由它们自身的倍数组合而成,而这里正是借助了这一性质简化了解决方案的设计过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wuhudaduizhang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值