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

官方精简思路:

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

对于操作B也一样.

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值