LOJ #2393. 「JOISC 2017 Day 2」门票安排 [思维,贪心]

好神啊 /kk

思路

可以证明, swap(A,B) 不会对答案造成任何影响,而如果每个人走的路径确定是 \(A \to B\)\(A \to 1 \to n \to B\) ,那么答案就是一条边被覆盖的次数的最大值。

为了方便,把题意换一下,变成每个人覆盖一些点, \([l,r]\)\([1,l)+(r,n]\)

先让所有人都覆盖 \([l,r]\) ,然后反转一个人,带来的变化就是 \([l,r]--, [1,l)++, (r,n]++\)

容易发现如果两个被反转的人的 \([l,r]\) 无交,那么一定不优。

所以会存在一个点,使得每个被反转的区间都经过这个点。

设被反转的区间的交是 \([x,y]\) ,一开始每个点被覆盖的次数是 \(a_i\) ,反转后每个点被覆盖的次数是 \(b_i\) ,令 \(t\)\([x,y]\)\(b\) 最大的位置。

性质 1 :存在最优方案使得 \(b_t \ge \max b_i - 1\)

证明:如果 \(b_t \le \max b_i - 2\) ,那么同时取消反转一个 \(l=x\)\(r=y\) 的区间, \(b_t\) 会增加,且答案不会更劣。

性质 2 :存在最优方案使得 \(a_t = \max a_i\)

证明:如果存在 \(a_k > a_t\) ,那么显然 \(k \notin [x,y]\) (否则 \(b_t\) 就不是 \([x,y]\) 中最大的),所以至少会有一个区间没有覆盖 \(k\) ,所以有 \(a_k-b_k \le a_t-b_t-2\) ,化简得 \(b_k-b_t \ge 3\) ,与性质 1 矛盾。

性质 3 :对于所有 \(a_k = \max a_i\)\(k \in [l,r]\)

证明:和性质 2 差不多。

所以我们可以确定一个所有反转的区间都经过的位置 \(t\) ,且知道最终答案就是 \(b_t\)\(b_t+1\)

二分答案,判断 \(w\) 是否可行。

\(cnt\) 为反转的区间个数,那么由于 \(w=b_t=a_t-cnt\)\(w=b_t+1=a_t-cnt+1\) ,所以只需要分别判一下 \(cnt=a_t-w(+1)\) 即可。

为什么强行定了 \(cnt\) 仍然满足二分性呢?如果 \(w\) 过大,那么 \(cnt\) 过小,那么就把最优解中反转的区间删掉一些即可。显然删掉之后仍然满足上面三条性质。

\(1\)\(t\) 贪心,贪心到 \(i\) 的时候把所有还没有反转且 \(l \le i, r \ge t\) 的区间按 \(r\) 加入大根堆中,而 \(i\) 会对前缀选的区间个数有一个限制(至少是多少),就贪心地在大根堆里面补齐即可。

限制长得像这样: \(a_i-x+(cnt-x) \le w\) 。特别地, \(i=t\) 时令 \(x=cnt\)

贪心结束后再扫一遍判是否合法即可。贪心正确性比较显然。

复杂度 \(O(n \log^2 n)\)

代码

咕了。

posted @ 2020-06-12 08:35  p_b_p_b  阅读(1241)  评论(4编辑  收藏  举报