Codeforces Round 943 (Div. 3)
1968D-枚举
思路:
每个人走的位置最多会形成长度为n的环,所以直接枚举走到某个位置之后后面就不走了的所有情况的最大值,相互比较即可
1968E-构造
题意:
设\(F(A_i,A_j)=|x_i-x_y|+|y_i-y_j|\),在\(N*N\)的矩阵中选n个点使所有不同的\(F(A_i,A_j)=|x_i-x_y|+|y_i-y_j|\)数量最多
1968F-枚举 二分
题意:
如果一个数组可以分成大于等于2的连续子数组,每个连续子数组的异或和都相等,那么这个数组叫做好数组
给一个长度为n的数组,给出q个询问,每次询问给出L,R,问能否数组\([L,R]\)是不是一个好数组
思路:
要算连续子数组的异或和,考虑用前缀异或和维护,
对于\([L,R]\)的数组,如果总的异或和是0,那么总能在中间找到一个分界点使左右两边相等,
如果总的不为0,那分出的字段应该是奇数个,不可能为偶数个,如果为偶数个总的异或和应该为0。如果为奇数个那么三个段其实就够了,因为如果分的段数大于3是可以变成3段的,比如五个段TTTTT,对于中间三个T,合并之后异或和为T,就变成了TTT,考虑三个段的情况,设第一段的右端点为X,第二段的右端点为Y,则整个序列为\(L--X--Y--R\)
那么L<=X<Y<R,如何找到X,Y的位置? 对于2、3段来说,总异或和为0,也就是说\(s[R]\oplus[X]==0\)即\(s[R]=s[X]\)
同理\(s[L-1]=s[Y]\),保存相同\(S[i]\)的下标然后二分查找
标签:--,943,Codeforces,异或,数组,Div,Round From: https://www.cnblogs.com/Danc1ng/p/18191178/Codeforces-Round-943-div3