2018-10-03 North American Invitational Programming Contest 2018
C - Flashing Fluorescents
题意:给出一排灯泡,有亮的有暗的,如果你改变第i个灯泡的状态,那么下一个时刻,i+1的灯泡会变,下下个时刻,i+2的会变,直到最后。每个时刻,你可以改变一个灯泡的状态。问,最早哪一个时刻,灯泡都是亮的。
solution:分组背包。
在最后一个时刻,你只能改变一个位置的状态,记为1。
在倒数第二个时刻,你能改变连续两个位置的状态,即为11。
依次递推。
然后,就是,每一组内,你只能挑选一个背包背。看哪个时刻,所有的背包的异或和异或最开始的状态全为1。
D - Missing Gnomes
题意:给出n,代表你要用n个数去构造一个排列,按顺序给出k个数,你需要构造的排列中要有k个数的子数组,且要字典序最小。
solution:可以发现,从最小的开始,未放过的,如果比当前的位要小,就放,否则跳到下一个位,放完即可。
H - Recovery
题意:有一个n*m的01矩阵,如果某一行有偶数个1,那么值为0,否则为1。列同理。给出行和列的值,你需要构造出符合行列的值的矩阵,要求,1的个数尽可能多,如果有多个,从第一行开始的字典序要最小。
solution:我们考虑在n*m全为1的矩阵上去挖0。那么现在,如果行为偶数,列的值不变,否则,也就是说,每一列上有奇数个1。如果这一列上的值为奇数,那么我需要挖去偶数个0,反之,我需要挖去奇数个0。行同理。这样之后,我们开始匹配,如果行列都需要挖去奇数个,那么我们将该行该列的数变成0。匹配完之后,势必会行或者列有剩余。我们同时填两个0,即可。为了保证字典序最小,行和列要从最后开始匹配,填0要保证填在第一行或者第一列。此外,开始前,如果行+列1的个数为奇数则不合法。因为每个1的出现,都同时会改变行和列的值,所以1的个数一定是偶数。
I - Red Black Tree
题意:给定一颗有根树,有红点和黑点,给定k,问拥有0~k个红点的集合有多少,且该集合中两两互不为祖先。
solution:类似于树分治的操作,dp[i][j]代表以当当前结点为根的子树中,拥有红点为j的集合数量。考虑dp[u]的形成过程,v1,v2为最先的两个儿子。那么直接将儿子合并起来即可,因为儿子的集合互不为祖先。然后,集合数累加,与第三个儿子继续合并。最后,将当前u这个点加入到集合中。
K - Zoning Houses
题意:按顺序给定一系列的点,然后给定m个询问。每个询问独立,给定l和r的区间,要求你需要找到一个边长最小的正方形去覆盖至少(l-r)个点。
solution:4个维度,用线段树或者st表,记录这个维度最值。每次搜索时,搜索这个维度的最值,比方说搜到的为k,然后你需要在(l,k-1)和(k+1,r)里去找这个维度的最值和另一个维度的最值做差。然后4次取最大值即可。