2018 年“三盟科技杯”中国大学生程序设计竞赛(湖南)
A. Easy h-index
题目描述:给出一个数组(a_i),求最大的(h),使得至少有(h)个数不少于(h)。
solution
模拟。
时间复杂度:(O(nlogn))
B. Higher h-index
题目描述:写论文,当一份论文花费了(x)小时时,这份论文会得到(ax)个引用,(a)是给定的常数,(x)必须为正整数,每份论文都可以被之后自己写的论文引用,现在有(n)个小时写论文,求最大的(h),使得至少有(h)份论文得到的引用个数不少于(h)。
solution
当(n leq a)时,答案为(n)。
当(n > a)时,若要使答案为(h),则采取贪心策略:每份论文只用一个小时,要保证前(h)份论文的引用个数不少于(h),则(h-a+h leq n),所以(h_max=frac{1}{2}(a+n)>n),所以最终答案为(frac{1}{2}(a+n))。
时间复杂度:(O(1))
C. Just h-index
题目描述:给出一个数组(a_i),每次询问一个区间([L, R]),求最大的(h),使得([L, R])内至少有(h)个数不少于(h)。
solution
可持久化线段树。
时间复杂度:(O(qlogn+nlogn))
F. Sorting
题目描述:给定(n)个三元组((a_i, b_i, c_i)),求一个字典序最小的排列(p_i),使得
solution
按题目要求排序。
时间复杂度:(O(nlogn))
G. String Transformation
题目描述:给定两个字符串(S, T),(S, T)由'a, b, c'组成,可以对字符串(S)进行操作,每次删除或插入'aa', 'bb', 'abab',问(S)是否能变成(T)。
solution
操作中没有'c',也就是说可以以'c'为间隔拆分字符串,通过手工计算,可以知道字符串中的'ab', 'ba'可以互相替换,因为'ab'->'abaa'->'ababba'->'ba',反过来'ba'就可以变成'ab',所以只要每一段的'a', 'b'的数目的奇偶性分别相等,则(S)可以变成(T)。
时间复杂度:(O(n))
I. Longest Increasing Subsequence
题目描述:给定一个数列(a_i leq n),设(f(x))表示将数列里的(0)替换成(x)后,最长严格上升子序列的长度,求(sum_{i=1}^n if(i))。
solution
显然,(f(x))要么等于原最长严格上升子序列,要么加一。所以只需要求出哪些数能让答案加一即可。所以先预处理出原序列的最长严格上升子序列,若(i)和(j)是最长严格上升子序列的相邻两位,且(i)和(j)之间有(0),则([a_i+1, a_j-1])内的数能使答案加一。这个可以从左到右扫一遍,然后记录最长严格上升子序列的某一位的最小的数是什么即可(这个数的位置的右边必须有(0))
时间复杂度:(O(nlogn))
J. Vertex Cover
题目描述:给出一个(n)个点的完全图,编号为(0)~((n-1)),点权为(2^i)。开始时(A)选定若干条边,然后(B)选择若干个点来覆盖这些边(每条边的端点至少有一个被选),(B)选的点的点权是最小的。求出(A)有多少种选择方案使得(B)的点权和为(k)。
solution
一个点能被(B)选上,必定是这个点与另一个点权比它大的点的连边至少有一条被选上,而且该点与比它小的点的连边都没有被选上。按照这个即可算出答案。
时间复杂度:(O(n))
K. 2018
题目描述:给定(a, b, c, d),求出满足(aleq x leq b, cleq y leq d, xy=2018)的数对((x, y))的个数。
solution
容斥原理。
时间复杂度:(O(1))