今天看见这样一道题目:
一个N*N的矩阵(N<2000),满足下列两个操作:
1.添加一个子矩形;2.查询某个点被多少个矩形覆盖,并销毁这些矩形。
如果没有后面这句“销毁”的话,这就是个水题了,直接用二维树状数组维护点事件即可,但是需要销毁,怎么办?
尽然不能直观的查询某个点会被多少个矩形覆盖,那么不防换一个角度:查询这个矩形是被哪个点销毁的,首先我们可以知道,每个矩形只会被一个点销毁,那么是满足什么条件的点才可以满足呢?我们相当于是找一个时间在我矩形创建之后,属于我的区域范围,操作时间最靠前的点!
到这里就豁然开朗了,我们把操作倒过来做一便,查询区间最小值!
一个浅显易懂的方法,给我的启示是:当前的操作不可能直接统计的话,我们应该换一个方向,换一个角度,
比如:离线!这是最常用的方法,
还有就是转换方向,统计与被统计~
在某些可以拆分或者相消的统计,考虑分段统计。
这让我想到了之前的一道题:完美选手数!
对于有些只判断是与否的问题,如果我们只是单纯的维护个是与否的话会不会太浪费了?有时可以通过转化把问题转化为区间最值以记录更多信息。