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)的是谁。
(ecause p_{sigma_{i-1}}+q_{sigma_{i-1}}<p_{sigma_{i}}+q_{sigma_{i}})
( herefore p_{sigma_{i-1}}<p_{sigma_{i}}+y_i)
( herefore y_i>p_{sigma_{i}}-p_{sigma_{i-1}})
(ecause sum p_i leq x)(多出来的给最后一个人即可,不影响排名)
( herefore 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 imes 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} ight ceil)。问最少需要多少钱。
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))