2024/12/27

模拟赛。

A

考虑一个 dp,定义 \(f_{l,r}\) 表示将区间 \([l,r]\) 中的数全部删完的方案数。有转移:

\[\max(f_{l+1,r-1},cost(l,r))\to f_{l,r}\\ \max(f_{l,k},f_{k+1,r})\to f_{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)\) 的复杂度内解决这个问题。

posted @ 2024-12-28 17:03  ddxrS  阅读(17)  评论(0)    收藏  举报