iefnah06

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

题意

长度为 \(10^6\) 的圆周上,有 \(n\) 个弧,第 \(i\) 条按照顺时针方向从 \(l_i\)\(r_i\)

构建这样一个图:如果弧 \(i\) 和弧 \(j\) 有交,则他们之间连一条无向边。求出这个图的最大团大小

解法

考虑一个团中最短的那条弧

注意到团内的弧一定会经过它的左右端点中的至少一个(否则要么根本不交要么就是包含了更小的弧)。可能作为团内点的弧关于端点有三种情况:

  • 同时经过两个端点:选就完事了
  • 只经过左端点
  • 只经过右端点

记集合 \(A\) 为只经过左端点的弧,\(B\) 为只经过右端点的弧,同集合内的点显然连通

记最短弧的长度为 \(T\),记 \(u_i\) 为弧 \(i\) 与最短弧的交的长度,\(v_i\) 为在最短弧外的长度。那么 \(a \in A\)\(b \in B\) 不连通的条件:\(u_a+u_b<T\)\(v_a+v_b<10^6-T\),也就是 \(u_a<T-u_b\)\(v_a<10^6-T-v_b\)

\(a \in A\) 看成平面上的点 \((u_a,v_a)\)\(b \in B\) 看成 \((T-u_b,10^6-T-v_b)\),那么合法的方案要求不存在一个 \(A\) 内的点在 \(B\) 内的点的左下方

假设已经确定了 \(B\) 中选的点,可以发现合法的 \(A\) 内点都在一个阶梯状划分线上方,所有的 \(B\) 点都在划分线下方

在 DP 时维护这个划分线即可,可以用线段树优化到 \(O(n \log n)\)

实现

https://ideone.com/M6Lx2a

posted on 2020-05-31 19:04  iefnah06  阅读(325)  评论(0)    收藏  举报