Codeforces Round #580 (Div.1)

前言

还好没打,不然掉蓝稳了qwq

A

题意

一个长度为\(2n\)的环,要把\(1\)\(2n\)填满这个环,使得对于所有的相邻的\(n\)个位置之和,任选两个的绝对值差\(\le 1\)

题解

\(n\)为偶数无解,因为\(n\)为偶数就说明任意相邻的\(n\)个位置之和都要是\(\frac{1}{2}*\frac{n(n+1)}{2}\),但是如果有\(n\)个位置之和正好为那个值,那么左端点和右端点都向某个方向移动,因为没有重复的数,得到的值一定不相等

考虑奇数,那么有\(n\)个和为\(\lfloor\frac{\frac{n(n+1)}{2}}{2}\rfloor\),\(n\)个和为\(\lceil\frac{\frac{n(n+1)}{2}}{2}\rceil\),并且一定是交替出现的,显然用下面代码中的方法即可得到解

code

B

题意

\(n\)个数,每个数看成一个点,两个点\(i,j\)有边当且仅当\(a_i\ \mathrm{and}\ a_j\neq 0\),要找出最小的环

题解

这种位运算的题按位考虑比较好,如果两个数在某个二进制位上都是\(1\),那么就能连边,注意不能连重边,所以要在两个数按位与的结果的\(lowbit\)处连边.注意我们要找环,所以考虑一个很强的特判,如果对于某个二进制位有超过三个数这一位为\(1\),那么答案就是\(3\).如果没有这样的情况,那么剩下有用的点和边只有\(log\)值域级别,然后最小环即可

然后我写个dfs找环WA飞了 找最小环可以割掉某条边,然后求出边的两个端点到所有的的最短路,用\(d1_x+d2_x+1\)更新答案

有更好的找最小环欢迎来评论区D窝qwq

code

C

题意

交互题,\(n*n\)的网格(\(n\)为奇数),每个格子上有\(0/1\),已知左上角为\(1\),右下角为\(0\),然后每次可以询问某个点到另一个不相邻的点是否可以只通过往下走和往右走能得到回文串路径,要还原这个网格,操作次数不能超过\(n^2\)

题解

首先考虑只询问长度为\(3\)的路径,容易发现这样询问可以知道两端点数字是否相等,所以用这个方法可以每次一个操作询问出所有坐标\((i,j)\)满足\(i+j\)为偶数的位置的值,具体方法是每次选一个知道值的点\((i,j)\),然后找到不知道值的\((i-2,j),(i+2,j),(i,j-2),(i,j+2),(i-1,j-1),(i+1,j+1)\)这些位置得到他们的值,递推实现即可

还有就是坐标的\(i,j\)之和为奇数的那些地方,首先可以把他们用上面的方法连出一个树出来,边权设为两端点的值不同为\(1\),相同为\(0\),然后两个点\(x,y\)在树上路径的异或和就是对应两个位置的值是否不同.这时知道了任意一个位置的值就能推出剩下位置的值

考虑每次询问长度为\(4\)的路径,这样可以推出某个坐标的\(i,j\)之和为奇数的位置的值,如果存在回文串就能得到两端点位置的值相等,但是不存在并不能说明那两个值就不同.进一步考虑长度为\(4\)的回文串情况,可以发现如果第一位的值\(\mathrm{xor}\)第三位的值=第二位的值\(\mathrm{xor}\)第四位的值,那么询问值为\(1\)就说明两端点值相等,反之不相等.所以如果要询问的两端点之间有这样一条路径就能通过只询问一次来得到另一端点,这个判断可以利用前面两个段落的做法判断,因为一组位置的值是已知的,另一组可以用之前构建的树推导出来(然后我也不知道为什么存在这种情况).容易发现这样的操作数为\(n^2-2\)

code

D

题意

一棵树,要求给每条边一个非负边权,然后两点路径长度为路径上边权之和,把所有路径长度写出来,要求从\(1\)\(\lfloor\frac{2n^2}{9}\rfloor\)这些数都要出现

题解

考虑把每个数这样表示\(AS+B\),其中$ B\in[0,S-1],A,B
$ 为整数, \(\max(A)S-1\ge \lfloor\frac{2n^2}{9}\rfloor\),那么如果找一个点为根,然后把儿子分为两类,一类点的子树内到根的路径权值为\(AS\),另一类为\(B\)并且取遍\([0,S-1]\)的整数,那么就可以通过选一条\(AS\)里面的链 接上\(B\)里面的链,就能构造出所有数

所以枚举这样的根,然后把儿子按子树大小升序排序,再让一个前缀的儿子为\(B\)类,记子树大小之和\(+1\)\(S\),剩下的为\(AS\)类,并且满足\(\max(A)S-1\ge \lfloor\frac{2n^2}{9}\rfloor\),就能构造解了,具体方法就是dfs儿子子树,然后维护当前要构造的路径长度,某条边的权值就是儿子到根长度-父亲到根的长度

感觉有点假

code

E

题意

定义一个串\(S\)的权值为长度\(<|S|\)\(border\)(相同长度且完全一致的前缀和后缀)个数,现在字符集大小为\(k\),问长度为\(n\)的串的权值的平方的期望

题解

F

题意

题解

posted @ 2019-08-20 22:12  ✡smy✡  阅读(161)  评论(0编辑  收藏  举报