2020 年「计算机科学与工程学院」新生赛总结
第一次作为出题人参与一场算法竞赛,感受还是很不同的。相比与参赛者,少了一些紧张刺激新鲜感,当然也少了一些自闭。
比赛在SCUT CODE上举行,总体而言这个系统做的还是挺不错的,响应迅速,功能齐全。唯一要吐槽的就是题目竟然只能添加不能删除!添加比赛需要一些玄之又玄的操作。还有Special Judge也是非常难配置,还缺少了交互功能。第一场由于没有放特别简单的签到题导致大量选手爆0,导致第二场人数锐减。。。不过第二场比赛的题目最后经过调整还是简单了许多的。下面按难度总结一下这次比赛的题目,目前题目已经全部开放了,可以在题库中找到提交。
所有相关题目的题库链接:
658. 垃圾邮件
661. 一个小游戏
662. Overload
663. 乒乓球
664. 超人高中生的基建计划
665. 灰之魔女的旅行
666. 艾尔奇亚的国王
667. umi炒饭
668. Dirichlet卷积
669. 1-2 心与心之间的距离,永不点亮的音乐会
670. 序列构造
671. 爆炸就是艺术
672. Tree
673. 猪灵的胜利之舞
674. Merge Stone
675. 学园都市的神秘代码
676. 世界棋盘
677. 谜拟Q plus
678. 射击训练
679. 小斯巴达们的历练
680. 主人和雷姆拉姆的秘密
682. 爆炸就是艺术2
683. 乒乓球2
射击训练#
题意:统计有多少个点在圆内。
利用距离公式计算即可,浮点数可以直接输出。
1 |
|
1 | a, b, r = map(int, input().split()) |
Overload#
题意:一颗以1为根的树,给定每个节点到父亲节点的距离,求到根节点的最大距离。
用dfs或bfs将树遍历一遍即可,也可以用带权并查集计算。
1 |
|
1 |
|
乒乓球#
乒乓球#
题意:求$\prod\frac{p_i}{100} \mod 1000000007$。
1 |
|
1 | from functools import reduce |
python自带的pow(注意不是math.pow)第三个参数可以传mod,复杂度为快速幂复杂度。
乒乓球2#
题意就是输出一列数的最小值和最大值。
这应该是整场比赛中最简单的题目了,只要能熟练掌握一种编程语言(C/C++/Java/Python)都应该能写出这题。
具体实现细节可以参考代码。
1 |
|
1 | input() |
注:在算法竞赛中Java通常要使用优化的读入方法,但为了简单起见,这里直接用Scanner类读入。
1 | import java.util.Scanner; |
从比赛中提交的代码来看,没有通过此题大多数情况是由于没有初始化变量。
学园都市的神秘代码#
题意:简化下面的代码。
1 |
|
做出这题不难,只需要把题目中的代码输入到电脑中,运行找找规律就能发现答案是n×(n+1)/2。
小技巧:在模意义下除2不用求逆元,可以转换成$(mod+1)/2$。
常见出错原因:n%mod*(n+1)%mod
导致溢出!
1 |
|
1 | for _ in range(int(input())): |
一个小游戏#
题意:一个n×m的01矩阵,每次可以选择以(1,1)为左上角,(x,y)为右下角的矩形翻转,(x,y)必须为1。L先手M后手,无法翻转的人输。
可以发现,每一步无论如何选择,(1,1)是必定要被翻转的。最终局面全0为必败态,反推可知(1,1)处为1是必胜态,为0是必败态。
1 |
|
1 | input() |
垃圾邮件#
题意:给一个长度为n的字符串s,有q次询问。每次临时将下标p的字符改为c,比较区间$[L_1, R_1]$和$[L_2, R_2]$的子串是否相同。
期望的做法是使用字符串哈希,每次询问可以做到O(1)
。
$hs[n]$表示字符串$s[1…n]$的哈希值,$bn[n]$表示$base^n$,均采用unsigned long long
自然溢出。
子串$s[l…r]$的哈希值为$hs[r]-hs[l-1]\times bn[r-l+1]$。
1 |
|
1 |
|
超人高中生的基建计划#
题意:n个点,i、j边权为i|j(i位或j),求最小生成树。
分析:显然边权不可能小于本身点的编号。对于奇数点,与1连最划算,边权为本身。剩下的点中除了$(10000)_2$这种的,都可以做到边权为本身。用log2统计这类点的数量。
答案就是$\frac{n\times (n+1)}{2}-1+\lfloor\log_2n\rfloor$
1 |
|
1 | from math import log2 |
灰之魔女的旅行#
题意:一颗以1为根的树,每次可以选则一个未访问的点,访问该点及其子节点。先选择1节点,问最多能选择几次。
树形DP入门题,类似题目:P1352 没有上司的舞会。
设$f[i][0]$表示不选择节点$i$的最大答案,$f[i][1]$表示选择节点$i$的最大答案。
转移:$f[i][0]=\sum max(f[i.son][1], f[i.son][0])$
$f[i][1]=\sum f[i.son][0]$
初始值$f[i][1]=1$,答案为$f[1][1]$。
1 |
|
由于输入保证为一棵树,即有子节点数目大于等于父节点数目,因此从叶子节点往上贪心选择可以保证最优。
1 |
|
merge stone#
分析:【多叉哈夫曼树】【贪心】
参考代码:
1 |
|
心与心之间的距离,永不点亮的音乐会#
题意:问两颗二叉搜索树上是否存在两个和为x的值。(分别位于两棵树上)
分析:【双指针】期望复杂度O(n),然而用set就可以过。。
参考代码:
1 |
|
convolution#
【Dirichlet卷积】
参考代码:
1 |
|
小斯巴达们的历练#
分析:
【最短路】【Dijkstra算法】
参考代码
1 |
|
序列构造#
题意:构造一个长度为 n 的整数序列,使得该序列的和与积相等,且恰好等于 n。
构造法#
参考证明:每日一题【1050】和积相等
情形一 n=4k+1 时,可以分成 2k 个 −1,2k 个 1,1 个 4k+1.
情形二 n=8k 时,可以分成 2k 个 −1,6k−2 个 1,1 个 2,1 个 4k.
情形三 n=8k+12 时,可以分成 2k+1 个 −1,6k+9 个 1,1 个 −2,1 个 4k+6.
情形四 n=4 时,|ai|∈{1,2,4},其中 i=1,2,3,4,且只有可能取 1 个 4 或 2 个 2,容易验证都不可行.
情形五 n=4k+2 时,由于a1⋅a2⋯an≡2(mod4),于是 a1,a2,⋯,an 为 1 个偶数和 4k+1 个奇数,它们的和为奇数,矛盾.
情形六 n=4k+3 时,a1,a2,⋯,an 为 4k+3 个奇数,设其中模 4 余 1 的有 m 个,模 4 余 3 的有 4k+3−m 个,因此a1+a2+⋯+an≡m−(4k+3−m)≡2m+1≡3(mod4),于是 m 为奇数,进而a1⋅a2⋯an≡$1^m⋅(−1)^{4k+3−m}$≡1(mod4),矛盾.
综上所述,所有具有性质 Q 的正整数构成的集合为{x∣x≡0,1,4,5(mod8),x≠4,x∈N∗}.
1 |
|
1 | n = int(input()) |
搜索法#
由$\lfloor\log_210^5\rfloor=16$可知,序列中最多有16个绝对值大于1的数,剩下的数用1或-1填充。
于是可以考虑搜索,dfs(num, target)
尝试用target个大于1的数构造一个乘积为num的序列,满足乘积后check
检查是否能通过填充1或-1来满足和也为n。
1 |
|
爆炸就是艺术#
爆炸就是艺术2#
题意:给n个TNT的坐标,一个TNT可以引爆上下左右以及本身位置的TNT。点燃代价为到原点距离,求最小代价。
判断点是否存在可以用map/set/hash,找连通块可以用bfs/dfs/dsu,做法非常多。注意实现细节,有重复的点。
1 |
|
1 |
|
爆炸就是艺术#
题意:给出平面上n个点的坐标,点i爆炸的代价为i到原点的距离(向下取整),点i爆炸会同时让与点i距离小于等于7的点爆炸。问爆炸所有点的最小代价。
分析:类似平面最近点对的方法建图。然后用并查集缩点。
对每个点扫描半径7以内的其他点的做法容易被卡。(虽然已经开到3s了)
建图具体做法参考:平面最近点对——非分治算法
1 |
|
1 |
|
tree#
【树形dp】
参考代码
1 |
|
1 |
|
猪灵的胜利之舞#
题意:$f[3]=4, f[4]=7, f[n]=f[n-1]+f[n-2]$,求$\frac{f[n]}{2^n}$
十进制快速幂#
二进制快速幂与十进制快速幂的对比(伪代码)
1 | ans = 1 |
1 | ans = 1 |
十进制快速幂和二进制快速幂在原理上是一样的,不过二进制快速幂通常实现为位运算,而十进制则用字符串来处理。
循环节#
斐波那契数列在1e9+7下循环节为2e9+16,这题答案就是斐波那契数列的第n项加上n-2项。
循环节可以通过如下程序暴力找出:
1 |
|
运行结果:
1 | 2000000016 |
参考代码#
1 |
|
1 |
|
1 |
|
艾尔奇亚的国王#
题意:A有 n 个筹码,可以从$[l_1, r_1]$区间随机选整数。
B有 m 个筹码,可以从$[l_2, r_2]$区间随机选整数。
数字大的人拿走数字小的人的筹码,(数字相同算平局),没有筹码的人算输。
求A、B赢的概率。
1 |
|
umi炒饭#
题意:给n个点的坐标以及权值,问一个长w宽h的矩形内的点权值之和的最大值。
前置知识:线段树、扫描线
1 |
|
1 | //#pragma GCC optimize(2) |
谜拟Q plus#
分析:【贪心】【dp】【二分】
参考代码
1 |
|
世界棋盘#
分析【min25筛法】【杜教筛】
参考代码:
1 |
|
1 |
|
2020 年「计算机科学与工程学院」新生赛总结