模拟赛。
A
考虑一个 dp,定义 \(f_{l,r}\) 表示将区间 \([l,r]\) 中的数全部删完的方案数。有转移:
可以在 \(O(n^3)\) 的复杂度内解决这个问题。
让我们按照 dp 值从小到大来更新每个 \(f_{l,r}\),可以发现,每个 \(f_{l,r}\) 只需要被更新一次。
所以,可以使用一个 bitset 来记录那些区间还没被更新和当前左/右端点的那些区间已经被更新。
将两个 bitset 与起来,就是当前 \(f_{l,r}\) 可以更新到的值。
时间复杂度 \(O(\frac{n^3}{w})\)。
B
一个贪心的策略是越大的 \(b_i\) 放在越前面越好。
但是现在还有一个 \(a_i\)。
我们可以先将它们按照 \(b_i\) 从大到小来排序,然后依次判断加不加入。
如果可以直接加入,那么就加入。
否则,就先加入它,然后选择一个删除后可以使代价最小的删除。
删除一个 \(i\) 可以减少的代价为 \(a_i+kb_i\) 加上其之后的所有 \(b_j(i<j)\) 也就是 \(b\) 的后缀和。
相当于我们要维护:
-
插入/删除一个数对 \((a_i,b_i)\)。
-
区间对 \(a_i\) 加,来统计后缀和。
-
区间对 \(a_i\) 减 \(b_i\)。
-
求全局可以减少的最大代价。
-
求全局 \(a_i\) 的和。
可以使用 KTT 来维护。
C.
原:AT_joisc2017_d 切符の手配
先对输入的数据进行处理,令 \(l_i=a_i\),\(r_i=b_i\)。若 \(l_i>r_i\) 则交换 \(l_i\) 和 \(r_i\)。然后将 \(r_i\) 减一。
对于每一个人,我们可以选择将 \([l_i,r_i]\) 或 \([1,l_i-1]\) 和 \([r_i+1,n]\) 加一,要求全局最大值最小。
设初始时每一个点被覆盖的次数为 \(a_i\),翻转某些区间后的每一个点被覆盖的次数为 \(b_i\)。
性质 \(1\):选择翻转的人,他们的区间 \([a_i,b_i]\) 有交。
证明:对于两个翻转的人,若他们的区间无交,那么他们覆盖的区间一定包含他们不翻转的区间的并,且他们的并均只会被覆盖一次。
那么此时若是不翻转他们的区间一定不会更劣。
所以,对于每一个被翻转的人,一定存在一个点使得他们的区间 \([a_i,b_i]\) 都经过这个点。
同时,我们可以发现,答案是具有单调性的。考虑来二分答案,假设二分到了 \(mid\)。
枚举一个点 \(x\),表示所有被翻转的区间都包含点 \(x\)。
令 \(p_i\) 表示左端点在 \(i\) 及 \(i\) 之前选择要翻转的区间的个数。
那么在 \(x\) 及 \(x\) 之前的点 \(i\) 的 \(b_i=a_i-p_i+p_x-p_i\le mid\)。
可以推出 \(p_i\ge \lceil \frac{a_i+p_x-mid}{2}\rceil\),通过枚举 \(p_x\) 的值可以得到 \(p_i\) 的下界。
我们只需要贪心的将所有 \(p_i\) 都补到下界,然后判断 \([x+1,n]\) 是否合法。
具体的,我们可以依次枚举 \(i=1,2,\dots,x\),将所有 \(l_j=i\) 的区间按照右端点全部加入一个大根堆里面,每次取出右端点最大的区间来覆盖。
可以做到 \(O(n^3\log n)\)。
假设所有被翻转区间的交为 \([x,y]\),令 \(t\) 为在区间 \([x,y]\) 中 \(b_i\) 取到最大值的点。
性质 \(2\):一定存在最优方案使得 \(b_t\ge \max\limits_{i=1}^n b_i-1\)。
证明:反证。若 \(b_t\le\max\limits_{i=1}^{n}b_i-2\),那分别取消一个 \(l=x\) 和 \(r=y\) 的区间,那么 \(\max\limits_{i=1}^n b_i-\) 值不会变大,所以这样调整答案不会劣,但同时 \(b_t\) 与 \(\max\limits_{i=1}^n b_i\) 的差值会变小。
性质 \(3\):一定存在最优方案使得 \(a_t=\max\limits_{i=1}^n a_i\)。
证明:如果存在一个 \(a_k>a_t\),那么 \(k\not\in[x,y]\),存在一个翻转了的区间覆盖了 \(k\) 而没覆盖 \(t\)。
由性质 \(2\):
\[a_k-a_t\ge 1,b_t\ge b_k-1 \]所以
\[a_k-a_t+b_t-b_k\ge0 \]也就是
\[a_k-b_k\ge a_t-b_t \]意味着包含 \(k\) 的翻转区间个数大于等于包含 \(t\) 的个数,矛盾。
所以,\(mid=b_t=a_t-p_x\) 或者 \(mid=b_t+1=a_t-p_x+1\)。
也就是 \(p_x=a_t-mid\) 或 \(p_x=a_t-mid+1\),所以可以省略掉一个枚举 \(p_x\) 的 \(O(n)\)。
性质 \(4\):\(x\) 可以取任意满足 \(a_x=\max\limits_{i=1}^n a_i\) 的 \(i\)。
证明:假设存在一个在 \([x,y]\) 外的 \(k\) 满足 \(a_k=\max\limits_{i=1}^n a_i\)。
由于覆盖了 \(k\) 的翻转区间个数小于覆盖 \(t\) 的,所以
\[a_k-b_k\ge a_t-b_t-2 \]由性质 \(3\) 可知,\(a_t=a_k\),所以 \(b_k-b_t\ge 2\),与性质 \(2\) 矛盾。
此时我们就可以在省略一个枚举 \(x\) 的 \(O(n)\)。
综上所述,每次二分的 check 我们只需要判断两次 \(p_x\) 的取值,同时 \(x\) 可以取任意 \(a_x=\max\limits_{i=1}^n a_i\)。
所以我们可以在 \(O(n\log^2n)\) 的复杂度内解决这个问题。