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\),且之间距离是奇数的点,先手必胜。

否则平局。

posted @ 2021-01-02 21:36  zlc0405  阅读(95)  评论(0编辑  收藏  举报