「考试总结」ZROI-21-CSP7连-DAY6 总结
#T1 聚会
#题意简述
给定一个长度为 \(n(n\leq5\times10^5)\) 的 01 串,一个位置 \(x\) 的价值为 \(x\) 到离它最近 1 的距离,问价值和。多组数据。
#大体思路
从两个方向分别扫一遍即可。
#Code
1 |
|
#T2 跳房子
#题意简述
一个长为 \(n(n\leq1000)\) 的严格递增的序列 \(\{x_i\}(x_i\leq10^{18})\),当且仅当 \(i<j\) 且 \(x_i|x_j\) 时由 \(i\) 向 \(j\) 连边,得到一个有向无环图,每条边边可以染成三种不同的颜色,要求不允许出现连续的长度大于 \(3\) 的相同颜色的边出现,输出染色方案。
#大体思路
定义函数 \(f(x)\),有 \(2^{f(x)}\leq x<2^{f(x)+1}\),按如下方式进行染色:
- 如果有 \(\left\lfloor\dfrac {f(x_i)} 4\right\rfloor=\left\lfloor\dfrac {f(x_j)} 4\right\rfloor\),那么将 \(i\to j\) 标为 \(1\);
- 如果有 \(\left\lfloor\dfrac {f(x_i)} {16}\right\rfloor=\left\lfloor\dfrac {f(x_j)} {16}\right\rfloor\),那么将 \(i\to j\) 标为 \(2\);
- 其余的标为 \(3\)。
正确性从二进制考虑,显然这样分,就是每四位分为一小组,每四小组分为一大组,总共 \(4\) 大组,每一小组内的最长路径经过不超过 \(4\) 个点,同样的,最长的、将四个大组全部相连的路径长度不超过 \(3\)。
#Code
1 |
|
#T3 人结
#题意简述
圆上有 \(n(3\leq n\leq500)\) 个点,顺时针编号为 \(1,2,\dots,n\),每个点与两个点相连,要求通过移动点在圆上的位置,使得最终的边没有交叉的一个环。
#大体思路
注意到当且仅当原图不联通时无解;而当有解时最终得到的环的形态是唯一的,又注意到操作的可逆性,于是转化为将一个 \(n\)-排列环变成顺时针方向为 \(1,2,\dots,n\) 的环。
考虑复制一遍断环为链,然后为保证次数最少,一定是一次就把一个不在自己位置上的数放到自己位置上,于是就变为在 \(2n\) 长度的序列上选中长度为 \(n\) 的段,求这一段的最长上升子序列长度,取最大值即可。
由于不能保证最开始得到的环是顺时针方向,所以需要反转后在求一遍。时间复杂度 \(O(n^2\log n)\).
#Code
1 |
|
#T4 辣椒
#题意简述
将一棵 \(n(n\leq2\times10^5)\) 个点的树通过断掉两条边变为三部分,定义差值为三部分中的最大大小减去最小大小,求最小差值。
#大体思路
先来考虑 \(O(n^2)\) 做法,即枚举两个点 \(x,y\),表示将这两个点向父亲的边断掉,则三部分的大小有以下两种情况(记 \(siz_x\) 为以 \(x\) 为根的子树大小):
- \(y\) 是 \(x\) 的祖先,那么大小分别为 \(siz_x,siz_y-siz_x,n-siz_y\);
- \(y\) 与 \(x\) 无祖孙关系,那么大小分别为 \(siz_x,siz_y,n-siz_x-siz_y\);
直接进行维护即可。
来考虑优化,假如当前选择的点为 \(x\),那么考虑从根到 \(x\) 路径上的点,需要在其中找到一个点 \(x\) 使得 \(|siz_y-\dfrac{n+siz_x}2|\) 最小,这个点集可以用 set
维护,然后直接 lower_bound()
查找即可,当从某个点向下深入时需要将该点加入该集合;
同样的,维护一个已经处理过但不是 \(x\) 的祖先的点集,需要在其中找到一个点 \(y\) 使得 \(|siz_y-\dfrac{n-siz_x}2|\) 尽可能小,同样可用 set
维护,注意当从一个点退出时,需要将该点从直系集合中取出,加入旁系集合。
时间复杂度为 \(O(n\log n)\).
#Code
1 | const int N = 500010; |