ABC179F:思维,数据结构

传送门:https://atcoder.jp/contests/abc179/tasks/abc179_f

题目大意:给你一个n * n 的矩阵,初始全是黑色。然后给你Q次操作。A操作:每次操作要么是选择从上往下将某一列染成白色,直到遇到白色块则停止。B操作:要么选择从左往右将某一行染成白色,直到遇到白色块则停止。最后问你Q次操作之后还剩下多少个黑色块?

本人思路:

操作A,B是对称的。考虑一次操作A。那么它会受到 之前某一次操作B的影响。

不难发现,这个问题和时间顺序也有关系。 在某一次操作A之前如果进行了 AB 或者 BA ,导致的结果将完全不同。所以需要引入时间轴。

将限制操作A的条件形式化表示出来即为:

假设本次操作A的位置是X。A会被受到影响的条件是: 存在 一个时间早于所有 【位置小于等于x】的操作A的时间 的 操作B。且若存在,这个操作的位置B应最小。

发现这一点之后,我们就不难用树状数组来维护这个事情了。

用两个数组来维护操作A,B的出现时间的前缀最小值。 用来查询 位置小于等于x的最早时间

然后再用前缀最小值数组 维护 当前时刻出现过的A,B的最小位置。 就是用来查询最小位置的。

然后就是模拟了。

AC代码:https://atcoder.jp/contests/abc179/submissions/16930484

扫描二维码关注公众号,回复: 11881155 查看本文章

官方精简思路:

考虑一个事实:对于第一次操作A,它操作完之后,位置在他右边的列能到达的位置是已经确定了的。

对于操作B也一样.

那么往后对这些列进行操作的话我们是O(1)知道答案的.就用数组存着第i行能到多远即可.

所以我们维护一个当前最靠左的列和当前最靠上的行.

对于能够更新最小值的列,更新.对于不能更新最小值的列,O(1)计算答案.

猜你喜欢

转载自blog.csdn.net/qq_35577488/article/details/108727118