Warning: session_start(): open(/tmp/sess_9cd8e59531faa5162e6afb97fe097d38, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430

Warning: mkdir(): No space left on device in /data/wiki/lib/plugins/dw2pdf/vendor/mpdf/mpdf/src/Cache.php on line 19
Temporary files directory "/data/wiki/data/tmp/dwpdf/288/" is not writable

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2020-2021:teams:intrepidsword:2020-ccpc-online [CVBB ACM Team]

用户工具

站点工具


2020-2021:teams:intrepidsword:2020-ccpc-online

Contest Info

Solutions

1001. Art Class

题目大意:有 $n$ 次操作,每次操作往平面上加个矩形,其中矩形底边在 $x$ 轴上,每次操作后求矩形并的周长。

题解:如果你把题意从周长读成了面积 : ) 那么就会发现是裸吉如一线段树。然而事实上周长仍然可以用吉如一线段树维护。

注意到周长可分成横向和纵向两个部分。对于横向部分,答案即为 $x$ 轴有矩形覆盖的长度乘 $2$。这部分容易离散化后用并查集维护。

对于纵向部分,容易发现答案为 $\sum_{i=-\infty}^{+\infty}|a_{i}-a_{i-1}|$,其中 $a_{i}$ 表示 $i$ 位置的最大值。我们可以在线段树上维护一个区间内的答案,以及左、右端点的长度,这样这棵线段树就已经是可合并的了。

考虑使用吉如一线段树维护修改。我们还需要维护最小值,最小值数量,严格次小值。考虑一次小于严格次小值的修改,那么相当于每个最小值都往上抬了一些,这会导致周长减小。

嗯?好像有些不对。只有旁边是非最小值的最小值,才会导致答案减小。因此事实上我们需要维护的不是最小值的数量,而是最小值的段数。注意这也是很容易合并的,我们判断一下左子树的 $r$ 和右子树的 $l$ 是否同时等于最小值即可。此外还有一种情况,最左边和最右边的最小值段抬高时,只会导致周长减小一倍而不是两倍(可以画图理解一下),需要特殊处理。

时间复杂度 $\mathcal{O}(n\log n)$。

2020-2021/teams/intrepidsword/2020-ccpc-online.1600936090.txt.gz · 最后更改: 2020/09/24 16:28 由 admin