Codeforces Global Round 9 题解

一场比赛全是构造题就nm离谱

A Sign Flipping

容易发现直接考虑正负交错就构造完了。

code

B Neighbor Grid

加到最简单的情况也就是:

2 3 3 2 
3 4 4 3 
2 3 3 2 

这种,如果方格中某个数比这种情况的数大就无解。

code

C Element Extermination

有解当且仅当(a_1<a_n)

如果不满足,(a_1)只能递增,(a_n)只能递减,他们之间的大小关系还是不变,肯定消不掉。
如果满足,他们之间一定存在可以删掉的数,沿着这个数一次删除即可。

code

D Replace by MEX

考虑构造形如(0,1,2,3...n-1)的序列。
求出当前数列的( ext{mex}),如果( ext{mex}in[0,n-1]),那么就把该位置填上( ext{mex})
否则( ext{mex}=n),找到一个位置它的值不符合我们的要求,然后把该位置填上(n)
这样子的话时间复杂度(O(n^2)),操作复杂度(O(2n))

code

E Inversion SwapSort

考虑(a_n ightarrow a_1)构造。
假设原序列是个排列,现在我们要将(i)放到(i)位置,那么我们现在就要把和位置(i)有关的( ext{pair})全部用完,令(pos_i)表示(i)所在位置。
此时(i+1sim n)全部都已经排好了,那么我们可以将(pos_{i+1...n})依次与位置(i)换一遍,发现这样的话就可以十分简单地将(i)挪到这个位置,而同时我们也保证了前面的数他们大小关系不变,问题就化为一个规模为(i-1)的子问题。
不是排列的话我们强行将(a_i=a_j,i<j)变为(a_i<a_j)即可。

code

F Integer Game

考虑先手如何绝杀:场上三个数成等差数列且最大值上轮被选过,那么直接加上公差即可。

怎样构造:首先将一个数加上一个很大的数(例如(1e11)),那么这个数肯定被钦定为最大值,不妨设它是(a)。然后将(a)变为(b,c)的等差中项,即使得(2a=b+c),因为(a)已经选过,那么直接加上(2a-b-c)必然奏效,可以记下此时最大值,再用最大值减去(a)就可以了。

code

G Tree Modification

将树黑白染色,发现一个菊花的话只有一个黑点或白点,而一次操作只能减去一个黑点或白点,那么答案就是染色后黑白点的数量最小值再减一。

code

H Set Merging

(O(nsqrt q))的分块写脸上了,又因为这题限制和值域相关,所以我们考虑值域分块。

值域分块后把每个值域内的数([l,r])按照他们在序列中出现的位置排好序,那么每次询问在一段值域上就对应着一段区间,这个区间可以二分出来,因为值域不交所以直接合并是可以的。

考虑块内我们怎么处理出所有的区间,可以对该值域进行分治,然后再暴力合并该值域内的位置(该过程较为难以描述建议看代码理解),一个块的操作复杂度(O(B^2))

由上述过程可知我们该算法的操作复杂度为预处理和询问两部分也就是(O(nB+frac {Qn}B)),结合数据范围可知(B=sqrt Q)时最优。

code

G Cubic Lattice

它 鸽 了

原文地址:https://www.cnblogs.com/heyujun/p/13472537.html