题解-CF1503
最近老是生病,都连续 \(10\) 场比赛垫底了。每次打比赛头晕脑胀,打完后感叹自己技不如人,有什么意义呢……感觉如果(此处省略 \(10 ^ 5\) 字)。
CF1503A Balance the Bits
\(0\) 必须是偶数个,要不然上下左右括号数都不一样。
上下 \(0\) 的部分写成 )(...)(
和 ()...()
可以最小化不平衡。
把 \(1\) 写成 (((...((()))...)))
可以最大化对不平衡的控制。
然后检查一下两个串是否平衡即可。
CF1503B 3-Coloring
容易想到黑白间隔染色。可以初始规定黑格必须染 \(1\),白格必须染 \(0\)。
只有 \(1\) 被染满然后出现 \(0\) 或者 \(0\) 被染满然后出现 \(1\) 会不能染。
这个时候把 \(2\) 也允许染进没染完的格子中即可。
CF1503C Travelling Salesman Problem
场上死这题了,保证要是头不痛 \(5\) 分钟把这题切了。
\(\max\) 没有几何意义,考虑到前后的和固定,可以转 \(\rm abs\)。
这东西是有几何意义的,有 \(n\) 个线段 \([a_i, a_i + c_i]\),要求从一个点开始依次走过每个区间回到原点距离最短。
可以对于每堆重叠的区间,每次一个区间走完往左走到这堆中另一个区间的开头,根据二分图的霍尔定理易证一堆重叠的区间总是可以从最左端点走到最右端点。然后再走到下一堆区间的最左端点,最后再回来即可。易证这样是最优的。
CF1503D Flip the Cards
先假设有解,然后基于有解想一个好做法。
容易想到排序然后单调栈,在不能同时翻转的卡之间连边然后对于每个连通块染色翻转点数小的颜色。
但是直接排序然后单调栈难以处理两个卡翻转一个后的关系。
有个结论:如果有解,每个卡必然由一个 \(\le n\) 的数和一个 \(> n\) 的数构成,否则就会有两张卡无论怎么翻都挂。
所以可以先把每个卡如果正面大于反面就反过来,这样任意两个卡翻了一个后的关系必然是合法的。
设一张卡小的面是 \(a\),大的面是 \(b\),按 \(a\) 大小排序,对 \(b\) 单调栈。
每个单调栈元素表示一个连通块中 \(b\) 的最小值。
每次用当前的 \(b\) 连接所有单调栈中小于它的连通块,然后删除这些被连接的连通块,然后把新的连通块的 \(b\) 最小值加入。
易证现在的图是所有形如 \(a_u < a_v\) 且 \(b_u < b_v\) 这样的不合法关系形成的图的每个连通块的生成树。
因为有解,所以原图是二分图,所以染色效果等同于现在的图,所以可以对现在的图进行染色和择优翻转。
然后翻转完后如果按 \(a\) 排序完后 \(b\) 是单调的,就说明是有解的,而且这就是最优翻转;否则无解。
连通块和染色可以用带权并查集实现,时间复杂度 \(\Theta(n\alpha(n))\)。