返回信息流题目给了三个输入,int m,int n 分别代表矩阵的行数和列数,以及一堆std::vector<std::vector<int>>的query.
对应的m*n的矩阵的每一个位置的值是(i+1) x (j+1).
现在query有三种操作
第一种query为[0] 代表找当前矩阵的最小值
第二种为[1,2] 1代表是按行操作, 2代表是第二行, 这个操作过后 矩阵的第二行全部失效。这种失效有可能导致矩阵的最小值查询变化。
第三种为[2,3] 2代表是按列操作, 3代表是第三列, 这个操作过后 矩阵的第三列全部失效。
现在给了一系列的query, 求query为[0]做查询的最小值的集合。
std::vector<std::vector<long long>> findMin(int m, int n,std::vector<std::vector<int>> query)
{
//code
}
lz用treemap来记录最小值,然后如果被disable了就减去1. 但是问题是会超时。。
比如当 m = 10000, n = 10000时 query = [[0]] 输出 1就好了。
实在想不出怎么做比较快,希望能得到指点~
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #98544同步于 2019/10/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
【问题】如何找到会修改的矩阵的最小值
zxzy
2019/10/26镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
所以你要想方法得到当前的左上角的坐标。
例如可以用hashset存储已经被消除的行号和列号。初始时左上角坐标为row, col = 0, 0,如果左上角恰好在当前要消除的行或列,则行号或列号+1,直至行号或列号不存在于hashset中。
【 在 zxzy 的大作中提到: 】
:
: 可是会被query的后两种使得某些行或列不可用
【 在 laplace 的大作中提到: 】
: 所以你要想方法得到当前的左上角的坐标。
: 例如可以用hashset存储已经被消除的行号和列号。初始时左上角坐标为row, col = 0, 0,如果左上角恰好在当前要消除的行或列,则行号或列号+1,直至行号或列号不存在于hashset中。
:
对 后来我也是这么想 但是我感觉其实用priority_queue可能会更快一点
用小根堆维护所有元素,再用两个bool数组标记某行/某列是否已经无效。两个修改就O(1)修改标记,查询就取堆顶,如果堆顶元素已经无效就弹出,循环直至堆顶元素堆顶元素有效。就是答案了。
k=n*m,复杂度O(klogk)
感谢!
【 在 ytz123 的大作中提到: 】
: 用小根堆维护所有元素,再用两个bool数组标记某行/某列是否已经无效。两个修改就O(1)修改标记,查询就取堆顶,如果堆顶元素已经无效就弹出,循环直至堆顶元素堆顶元素有效。就是答案了。
: k=n*m,复杂度O(klogk)