2021“MINIEYE杯”中国大学生算法设计超级联赛 第一场 题解
题目链接
https://acm.hdu.edu.cn/contests/contest_show.php?cid=984
A
简单结论题
B
Pro:
依次向平面添加\(n\)个点
第\(i\)个点会对其半径\(r_u\)的范围内的所有点\(j\)造成\(v_j\)的损失。
求加入每个点后的损失和。
保证数据随机
Sol:
1.
kd-tree硬冲即可。
2.
考虑把平面分块\(70*70\),把每个点丢到对应的块中。每次暴力枚举所有的块。
块被分为三种,完全覆盖,部分覆盖,无覆盖。
完全覆盖和无覆盖直接统计,部分覆盖的枚举块内所有点统计答案即可。
C
Pro:
给定一张网格图
选出一些边,使得构成若干个边不相交的封闭环。
求每个格子对其四个相邻边选择数量的奇偶有限制。
求方案数。
Sol:
容易发现只需保证所有点度数为偶数即可。
故所有限制均可转化为异或方程组,高斯消元求秩即可。
D
不会
E
CCPC2020网络赛原题
F
Pro:
求区间异或和\(>=k\)的最短区间
Sol:
限制:\(S_r \ xor \ S_{l-1}>=k\)
考虑枚举右端点,\(Trie\)树维护答案。
具体实现在\(Trie\)上按位贪心即可。
G
Pro:略
Sol:
可以列出\(x\)关于\(n\)和\(t\)的方程。
使用\(bsgs\)求解即可。
由于式子中含有(-1)^t,需要分奇偶讨论。
H
Pro:
求面积最大的每一列都单调递增的子矩阵。
Sol:
预处理每个位置最多能向上延伸多高。
枚举下边界,单调栈求解即可。
I
\(kruskal\)搞一搞
J
Pro:
二维平面\(n\)个点形如\((i,f[i])\)。
多次询问一个矩形内所有的点有多少种\(y\)坐标。
Sol:
首先有一个比较蠢的树套树的\(log^2n\)的做法,不多赘述。
考虑莫队,瞎做的话是直接套一个树状数组,\(O(n*sqrt(n)*logn)\)
瓶颈在于维护一个可重集合,
支持插入数字,删除数字,统计区间[l,r]内至少出现过一次的数字个数。
树状数组的话\(logn\)
写的比较好可以直接硬冲过去。
考虑莫队有\(O(n*sqrt(n))\)次修改,\(O(n)\)次询问。
现有的做法是修改和询问都是\(O(logn)\)
实际上,不难实现一个修改\(O(1)\),查询\(O(sqrt(n))\)的值域分块的做法。
复杂度降为\(O(n*sqrt(n))\)
K
Pro:
一个长度为\(n\)的项链,用红蓝绿三种颜色染色,相邻颜色不能相同,绿色最多\(k\)次,旋转同构。
求方案数。
Sol:
\(Burnside\)一下
//对于转动\(i\)次的置换,环长为\(\frac{n}{gcd(i,n)}\),等价类个数为\(gcd(i,n)\)
f(x)表示长度为\(x\)的环,用三种颜色染色,相邻颜色不能相同,绿色的个数不超过\(\frac{x*k}{n}\)个的方案数。
对于\(f(x)\),不妨枚举绿色的个数。
即设\(f(x)=\sum g(x,k)\)
计算\(g(x,k)\)需要大力分类讨论一下情况。
1.第一个位置为绿色:
考虑先选择哪些位置放绿色。
问题等价于把(x-1)-(k-1)的序列分为k段,要求每一段都不为空。每一段中只要确定第一个位置是红色还是蓝色,剩下位置颜色确定,故需要额外乘上一个系数。
插板法:\(C(x-k-1,k-1)*2^{k}\)
2.第一个位置不为绿色:
做法类似
\(C(x-k,k)*2^{k}\)
综上,我们得到了\(ans\)的表达式
这个式子的暴算的复杂度是小于等于\(n\)的所有约数的和的,而\(n\)的约数和大概是\(5n\)左右,暴力计算即可。