A.只需要判断长度为偶数,左括号不在最后一位,右括号不在第一位即可.
B.答案为(a)的前缀和最大值和(b)的前缀和最大值之和(前缀和包括(0)).
C.可以从前一段篱笆离地面距离取值范围推出后一段取值范围.第一段设成([0,0]),检查最后一段左端点是否为(0).
D.假设(n)比较大,考虑(2,4,16,256,63556,n)这(6)个数,其它数都可以除以(n)得到(1),而(n)可以除以(65536)两次得到(1),(65536)可以除以(256)两次得到(1)...,最多操作次数为(n+4).(n)小的情况类似.
E.考虑(x),假设答案前(k-x)位全为(0),考虑所有还未匹配到的串后(x)位,如果(0)到(2^x-1)都出现过一次,那么不存在前(k-x)位全为(0)的答案.否则,只要选没出现过的数的取反,那么其他任何一个数都和这个数至少有一位相等.当(2^x>n)时,必然存在答案,因此可以选择(x)为(min(k,log n)).
F.显然每条链的长度越长越好,因此应该从大到小添加每条链.每次添加应该对折这条链,并且接到深度最小的白点上.如果白点超过(k)个,更新当前第(k)深的点到答案上.
可以有很多方法模拟这个操作,比如用线段树维护每个深度的点的数量.但实际上也可以二分答案再模拟或者直接线性模拟这个操作.