https://codeforces.com/problemset/problem/1348/F
题目大意,一队人排队,每个人能安排连续的一段位置[a,b],问安排的方案是否唯一,如果不唯一,任意输出两种。
第一眼看上去直接用dinic求二分图匹配,然后发现数据量是2e5,感觉不太够,并且判唯一也不好做。看了题解发现这类问题其实有贪心的方案的。
我们首先目标是找出任一组合理安排,从1到n遍历位置安排人选,安排哪个人呢?a位于当前位置或左边,且b最小的那个。这样的人目前是最急需安排的,这种方案如果不行,那么就无法安排了。最小b可以通过一个multiset维护。同时我们不用担心这个最小b会比i小,因为前面已经安排了i-1个,如果第i大的b比i小则说明没有合法方案。
这样一来就找到了合法安排方案,接下来研究是否能找到第二种。我们可以证明,如果存在不止一种安排方案,那么必然有一种是仅仅交换两个人。可以交换两个人需要满足什么条件呢?设i和j可交换且posi<posj,那么需要aj<=posi&&posi<posj<=bi。这个条件很容易理解。具体实现可以通过线段树维护位置区间上a的区间最小值(依据第一种合法方案),每次仅需查询位于i+1,b区间上的人的a最小值,如果比i小,就说明它可以和i位置的人交换。
1 |
|