Petrozavodsk Summer Training Camp 2017
Problem A. Connectivity
题目描述:有\(n\)个点,现不断地加边。每条边有一种颜色,如果一个点对\((a, b)\),满足\(a=b\)或对于每一种颜色的子图(图中只有该种颜色的边),\(a, b\)总是连通,则该点对称为好连通。求出每加一条边,好连通的点对数。
solution
每个子图用并查集维护连通块,并且用\(vector\)记录每个连通块的点,便于之后进行答案的统计,合并时启发式合并即可。
每种颜色生成一个\(hash\)值,每个点记录一个\(hash\)值,表示在每个子图中是属于哪个并查集,若两个点的\(hash\)值相同,则认为它们是好连通。
时间复杂度:\(O(mlogn)\)(常数比较大)
Problem B. Hotter-colder
Problem C. Painting
题目描述:有连续\(n\)个,每个点开始时都没有颜色,现在每次选择一个连续的区间,然后将这个区间涂成一种颜色,使得最终变成目标的样子。颜色有\(m\)种,每种颜色至少出现一次,涂色也只能涂\(m\)次,每次涂色的花费为区间长度。问总花费的最大值。
solution
可以先预处理出每种颜色的最小涂色区间,由于数据的特殊性,这些区间是不相交的,只可能是相离或包含。这样就可以按嵌套关系将区间分成很多层,必须先涂外层,再涂内层。对于同一层的区间,再分成很多段,每一段是连续的相邻的区间,每一段用\(dp\)来确定如何涂色,答案就是全部加起来的值。
时间复杂度:\(O(n^2)\)
Problem D. Ones
题目描述:定义一种1-expressions
\(E ::= 1 | E+E | E*E | (E+E) | (E*E)\),给出一个数\(k\),用一个不多于\(100\)个\(1\)的表达式,使得答案为\(k\)。
solution
偶数时除于二,奇数时减一。
时间复杂度:\(O(logk)\)(每次询问)
Problem E. Seats
Problem F. Ants
Problem G. Permutation
题目描述:给出一个\(n\)排列\(p_i\),将其分成两个子序列,使得一个子序列递增,另一个递减。或无解。
solution
贪心。假设枚举到第\(i\)个数,如果\(p_i\)小于递增序列最后一个数,则扔进递减序列,若大于递减序列最后一个数,则扔进递增序列,若两个条件都满足,则无解。如果是介于两者之间,则考虑\(p_{i+1}\),若\(p_{i+1}>p_i\),则扔进递增序列,否则扔进递减序列。
时间复杂度:\(O(n)\)(每次询问)
Problem H. Primes
题目描述:定义\(\pi (x, y)\)表示能同时整除\(x, y\)的质数个数。给出\((a, b)\),求出\(\sum_{a \leq x < y \leq b} \pi(x, y)\)
solution
答案为\(\sum_{d} \left \lfloor \frac{b}{d} \right \rfloor - \left \lfloor \frac{a-1}{d} \right \rfloor\),\(d\)为质数。然后其实对于不同的\(d\),里面的值也可能一样,可以将值一样的\(d\)一起算,也就是跳着跳着算。
时间复杂度:\(O(log^2n)\) (每次询问)
Problem I. Vertex covers
Problem J. Scheduling
题目描述:有\(m\)个线程,有\(n\)个需要执行的程序,每个程序需要在时刻\(p_i\)到\(k_i\)内执行,执行时间为\(c_i\),每条程序可以随意暂停,跳转线程,但同一线程同一时刻只能执行一条程序。问是否能执行所有程序。
solution
将时刻拆分成若干个区间,每个区间连向汇点,流量为区间长度,每个程序连向源点,流量为程序的执行时间,然后每个程序连向所在的区间。跑一遍网络流就可以了。
时间复杂度:\(O(n^2m)\)
Problem K. Shufe
题目描述:有\(2^n\)张牌,有一种洗牌的方法:1、如果只有两张牌,则交换它们。2、将牌分成上下两堆,交换两堆牌,然后每堆牌递归操作。问洗\(t\)次牌后的顺序。
solution
显然,洗一次牌后所有牌会调转,再洗一次就会变回原样。
时间复杂度:\(O(2^n)\)
原文地址:https://www.cnblogs.com/GerynOhenz/p/8637875.html