Global Round 1 题解(1110A~F)
\(Global Round1\)题解(1110A~F)
\(zhanglichen\ 2021.1.2\)
\(A.Parity\)
给出\(2\)个数字\(b,k\)。
给出一个长度为\(k\)的数组,询问\(\sum_{i=1}^na_i*b^{k-i}\)的奇偶性。
\(Solution\)
简单模拟,\(C\)语言月考。
\(B.Tape\)
给出以根长度为\(m\)的木棍,上面有\(n\)个断点。你可以截取\(k\)个任意长度的碎片把端点接起来。对于一个长度为\(x\)的碎片,如果把它放在位置\(p\),那么它会覆盖\(p\)到\(p+x-1\)位置的所有端点。询问碎片的最小总长度。
\(Solution\)
建一个断点的差分数组,从大到小排序,然后贪心的取前\(k-1\)个差分元素空出来即可。
\(C.Meaningless Operation\)
给出一个范围是\([0,2^{25}-1]\)的正整数\(a\),请你找到\(1\)个正整数\(b(0<b<a)\),使得\(gcd(a\oplus b,a\&b)\)的值最大。
\(Solution\)
首先提取出\(a\)的二进制形式。
如果存在一个\(0\)位,比如\(111101111\),那么我们可以把\(b\)设为\(000010000\),答案是\(111111111\),显然这是最优解。
现在考虑不存在\(0\)位的情况。由于\(a\)不存在\(0\)位,我们要求的值可以转化为\(gcd(b,a-b)\)。答案就是\(a\)的最大因数。
\(D.Jongmah\)
给出以一个数组\(a\),\(1\)个三元组\((a,b,c)\)称为合法:
(1)\(a=b\)且\(b=c\)。
(2)\(a+1=b\)且\(b+1=c\)。即\((a,b,c)\)可以构成一个顺子。
\(Solution\)
假设我们当前枚举到的元素值为\(x\),那么它对答案的贡献可以有以下\(3\)种:
\((x,x,x)\)
\((x-2,x-1,x)\)
\((x-1,x,x+1)\)
\((x,x+1,x+2)\)
考虑一个\(dp\)的思路。
定义状态\(f(i,j,k,l)\)表示到第\(i\)个元素为止,第\(i\)个元素,有\(j\)个作为第\(2\)种状态被统计,有\(k\)个作为第\(3\)种状态被统计,有\(l\)个作为第\(4\)种状态被统计时对答案的贡献。并且只需要统计\(j<3\)且\(k<3\)且\(l<3\)
的情况即可。因为\(3\)个\((x,x+1,x+2)\)和\(x,x+1,x+2\)各取三个对答案的贡献是一样的。
状态转移方程:\(f(i,j,k,l)=max(f(i-1,?,j,k))+l+(c[i]-j-k)/3\)
最后取\(max(f(m,i,0,0))\)为答案。
\(E.Magic Stone\)
给出\(2\)个长度为\(n\)的数组\(c\)和\(t\),一次操作可以把\(c_i=c_{i+1}+c_{i-1}-c_i\),同时保证位置\(i+1\)和位置\(i-1\)合法。
询问是否可以通过一些操作把\(c\)变成\(t\)。
\(Solution\)
性质:不停的做这个操作,只是把差分数组打乱。
所以建立\(c\)和\(t\)的差分数组并排序,询问是否一样即可。前提要保证\(c_1\)等于\(t_1\),\(c_n\)等于\(t_n\)。
\(F.Nearest Leaf\)
给出一棵带边权的树,请你根据以下代码给每个节点重新编号:
next_id = 1
id = array of length n filled with -1
visited = array of length n filled with false
function dfs(v):
visited[v] = true
id[v] = next_id
next_id += 1
for to in neighbors of v in increasing order:
if not visited[to]:
dfs(to)
多次询问,每次询问给出三个数\(v,l,r\),表示询问从节点\(v\)到节点编号在\(l\)到\(r\)之间的叶子节点的最短距离。
\(Solution\)
根据\(DFS\)序的性质,一个节点\(x\)的子树区间是\(x\)到\(x+size[x]-1\)。
可以考虑对询问离线,\(v\)相同的询问一组。
然后先构建出一个数组\(d\),表示节点\(1\)到所有叶子节点的距离。然后考虑搜索的时候修改\(d\)数组并回答询问。
假设当前搜索到的节点是\(x\),从\(x\)转移到\(x\)的儿子\(y\),\(y\)的子树区间的所有元素\(-1\),除了\(y\)子树区间的所有元素\(+1\)。这样数组\(d\)存的就是\(y\)到所有叶子节点的距离。
回答每个询问,就找\(d\)上\(l\)到\(r\)之间的最小元素。
区间修改+区间询问,显然可以用线段树维护。
神秘\(Bug\):线段树要开到\(n+1\),不然会报错,不知道为什么。
\(G.Tree-Tac-Toe\)
树上有些节点已经被染成白色了。先手可以把树上未染色的节点染成白色,后手可以把树上未染色的节点染成黑色。当有一方把树上一个长度为\(3\)的路径染成自己的颜色时胜利。
询问在双方都足够聪明的情况下,谁能赢。
\(Solution\)
为了方便讨论,先把已经被染色的节点转化成未染色的节点。
对节点作这样的构造可以实现未染色并且不影响胜负的效果。
如果存在一个度数大于\(4\)的点,先手必胜。
如果存在一个度数为\(3\),并且\(2\)个儿子不是叶子的点,先手必胜。
如果存在\(2\)个度数为\(3\),且之间距离是奇数的点,先手必胜。
否则平局。