2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)
Odd Palindrome
题目描述:给出一个字符串,判断是否存在一个子串,满足长度为奇数,且为回文串。
solution
暴力枚举。
时间复杂度:\(O(n^3)\)
Enlarging Enthusiasm
题目描述:有\(n\)个人,每个人有一个成绩\(p_i\),每个\(p_i\)都不相同。现给定一个数\(x\),给每一个人分配一个数\(q_i \geq 1\),满足\(\sum q_i=x\)。每个人的总成绩为\(p_i+q_i\),现按\(q_i\)从小到大排序,若\(q_i\)相同,则按\(p_i\)从小到大排序。按顺序宣布成绩,使得每宣布一个人的成绩,成绩最高的人会变化。问最终的排名有多少种。
solution
显然,\(q_i\)要是多大,只跟排在它前面一个人的总成绩有关,所以可以用状压dp
。
因为\(q_i\)要递增,所以可以考虑差分。
设\(y_i \geq 0, p_i=\sum_{j=1}^{i} y_j, \sigma_i\)为一个\(n\)排列表示排名为\(i\)的是谁。
\(\because p_{\sigma_{i-1}}+q_{\sigma_{i-1}}<p_{\sigma_{i}}+q_{\sigma_{i}}\)
\(\therefore p_{\sigma_{i-1}}<p_{\sigma_{i}}+y_i\)
\(\therefore y_i>p_{\sigma_{i}}-p_{\sigma_{i-1}}\)
\(\because \sum p_i \leq x\)(多出来的给最后一个人即可,不影响排名)
\(\therefore \sum_{i=1}^{n} (n-i+1)y_i \leq x\)
假设到了排名\(i\),\(x\)还剩\(rest\),则\(y_i \leq \frac{rest}{n-i+1}\)
设\(f[sett][rest][pv]\)表示\(sett\)中的人已经排在前面,\(x\)还剩\(rest\),前一个人为\(pv\)。
枚举\(i\)表示下一个人,按照前面的分析求出\(y_i\),显然\(y_i\)最小最好,但也不能超出最大值的限制。状态转移也比较简单。
时间复杂度:\(O(2^n x n^2)\)
Fear Factoring
题目描述:定义\(f(n)\)表示\(n\)的因数的和。给出两个数\(a, b\),求\(\sum_{i=a}^{b} f(i)\)
solution
设因数\(d\),在\(a\)~\(b\)中,\(d\)的倍数除以\(d\)得到的数是连续的,即可以用求和公式得到。
设\(x\)为\(a\)~\(b\)中第一个\(d\)的倍数,则\(x=max((\frac{a-1}{d}+1)*d, d*d)\)(避免重复)
设\(s\)为\(a\)~\(b\)中大于等于\(x\)的\(d\)的倍数的个数\(s=\frac{b-x}{d}+1\)
更新答案\((s*d)+(\frac{x}{d}+\frac{x}{d}+s-1)*\frac{s}{2}\),注意:如果\(x=d*d\),则答案要减去\(d\)(重复)。
时间复杂度:\(O(\sqrt{b})\)
Rainbow Roads
题目描述:给出一棵树,每条边有一种颜色。定义一条彩虹路为路径上的相邻边的颜色不一样。定义一个好点为从该点出发的所有路径都是彩虹路。输出所有好点。
solution
树形dp
,仔细分析即可。
时间复杂度:\(O(n)\)
Straight Shot
题目描述:在一个二维平面上,在原点放一个机器人,速度为\(v_0\),现要机器人最快地走到\((x, 0)\)。但中间有不相交的\(n\)条滑道,第\(i\)条滑道的范围为\([L_i, R_i]\),滑道会给机器人一个竖直的速度\(v_i\),但机器人面向的方向不变,问机器人最短多长时间到达终点。或时间长于两倍直线时间。
solution
显然,滑道可以全部连在一起,即将所有滑道并排移到最后,然后从终点倒着走回去,找到离开滑道的坐标,最快就是从\((0, 0)\)走到那个坐标。然后判断一下时间即可。
时间复杂度:\(O(n)\)
Distinct Distances
题目描述:给出\(n\)个点,然后在平面上找到一个点\(p\),使得每个点到\(p\)的距离的不同值最少。输出最少值。
solution
\(p\)点选择有三种情况:
- 两个点的中点
- 三点构成的圆的圆心
- 两点的垂直平分线与另外两个垂直平分线的交点。
时间复杂度:\(O(n^5logn)\)
Security Badge
Avoiding Airports
题目描述:有\(n\)个城市,\(m\)条航线,每条航线连接两个城市(起点为a_i, 终点为\(b_i\)),有一个起飞时间\(s_i\)和一个到达时间\(e_i\),现在从\(1\)出发到\(n\),使得在每个城市的等待时间的平方和最少。输出最小值。
solution
按\(e_i\)从小到大排序,假设使用第\(i\)条航线时等待时间的平方和为\(f[i]\),假设前一条航线为\(j\),则\(f[i]=min_{b_j=a_i} (f[j]+(s_i-e_j)^2)\)
\(f[i]=min_{b_j=a_i} (f[j]+(s_i-e_j)^2)\)
\(f[i]=min_{b_j=a_i} (f[j]+s_i^2-2s_ie_j+e_j^2)\)
\(f[i]=min_{b_j=a_i} (f[j]+s_i^2-2s_ie_j+e_j^2)\)
当\(i\)一定时,取\(-2e_js_i+f[j]+e_j^2\)的最小值,设\(A=-2e_j, B=f[j]+e_j^2\),可以将其看成一条直线\(Ax+B\),也就是在很多条直线上选\(x=s_i\)的最小值。所以在每个城市维护一个凸壳,询问时二分查找即可。
时间复杂度:\(O(mlogm)\)
Long Long Strings
题目描述:有一个很长的字符串,有两种操作:1、删除某个位置的字符。2、在某个位置插入某个字符。给出两组操作,问这两组操作得到的字符串是否相同。
solution
将初始字符串看成一个\([1, 10^{11}]\)的区间,然后将这两种操作看成是区间操作,最后判断最后得出的区间是否相同。
时间复杂度:\(O(n^2)\)
Grid Coloring
题目描述:有一个\(m \times n\)的网格图,每个格子将涂成红色或者蓝色,但要满足下面条件:
- 每个格子都要涂颜色
- 有些格子的颜色已经决定,不能改变。
- 当某个格子\((x, y)\)的颜色为蓝色时,以\((1, 1)\)和\((x, y)\)形成的矩形一定都是蓝色。
求有多少种涂色的方案。
solution
只需要关注蓝色的格子即可,其它的格子都是红色,而且每一行只需要考虑最右边那个蓝色格子。
如果第\(i\)行第\(j\)列是蓝色的格子,则后面的行的蓝色格子的列小于\(j\),否则前面第\(i\)行第\(j\)列的蓝色格子没有作用。按照这来dp
。
时间复杂度:\(O(n^3)\)
Spinning Up Palindromes
题目描述:给出一个字符串,字符串的每一位为\(0\)~\(9\),每次操作给某一位加一,如果这一位变成\(10\),则将这一位变成\(0\),然后前一位加一,如果又变成\(10\),则继续一样的操作,当第一位变成\(10\)时,将其变成\(0\)即可。问至少需要多少操作使得字符串变成一个回文串。
solution
不会。
Delayed Work
题目描述:有一个刷屋子的工作,请一个工人需要\(X\)元,如果刷屋子需要\(D\)天,则要付\(D \cdot P\)元,如果有\(M\)个人,则需要\(\left \lceil \frac{K}{M} \right \rceil\)。问最少需要多少钱。
solution
枚举即可,显然\(M \leq K\)
时间复杂度:\(O(K)\)
Unsatisfying
题目描述:有\(n\)条表达式,每条表达式有两个变量,中间的运算符为\(\vee\),每个变量前有可能有\(NOT\)符号。现在可以添加一些表达式,这些表达式没有\(NOT\),使得全部表达式不全为真,问最少添加多少表达式。
solution
按\(2-SAT\)的做法构图,问题变成在图中添加一些边(从负指向正的边),使得存在一个\(i\),\(i\)与\(NOT\) \(i\)在一个环内。设\(f(x)\)表示\(x\)能到的点的集合,\(r(x)\)表示能到\(x\)的点的集合。
假如原图已经存在,上述的环,则答案为\(0\)。
如果\(f(i)\)与\(f(NOT\) \(i)\)的交集存在\(NOT\)点,以及\(r(i)\)与\(r(NOT\) \(i)\)的交集存在正点,则只需一条表达式即可。
如果\(f(i)\)存在\(NOT\)点,\(r(NOT\) \(i)\)存在正点,则只需两条表达式即可。
否则无解。
时间复杂度:\(O(n^2)\)