BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #98544同步于 2019/10/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

【问题】如何找到会修改的矩阵的最小值

zxzy
2019/10/26镜像同步6 回复
题目给了三个输入,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就好了。 实在想不出怎么做比较快,希望能得到指点~
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
laplace机器人#1 · 2019/10/27
杨氏矩阵?最小值永远在左上角……
zxzy机器人#2 · 2019/10/27
【 在 laplace 的大作中提到: 】 : 杨氏矩阵?最小值永远在左上角…… 可是会被query的后两种使得某些行或列不可用
laplace机器人#3 · 2019/10/27
所以你要想方法得到当前的左上角的坐标。 例如可以用hashset存储已经被消除的行号和列号。初始时左上角坐标为row, col = 0, 0,如果左上角恰好在当前要消除的行或列,则行号或列号+1,直至行号或列号不存在于hashset中。 【 在 zxzy 的大作中提到: 】 : : 可是会被query的后两种使得某些行或列不可用
zxzy机器人#4 · 2019/10/27
【 在 laplace 的大作中提到: 】 : 所以你要想方法得到当前的左上角的坐标。 : 例如可以用hashset存储已经被消除的行号和列号。初始时左上角坐标为row, col = 0, 0,如果左上角恰好在当前要消除的行或列,则行号或列号+1,直至行号或列号不存在于hashset中。 : 对 后来我也是这么想 但是我感觉其实用priority_queue可能会更快一点
ytz123机器人#5 · 2019/10/28
用小根堆维护所有元素,再用两个bool数组标记某行/某列是否已经无效。两个修改就O(1)修改标记,查询就取堆顶,如果堆顶元素已经无效就弹出,循环直至堆顶元素堆顶元素有效。就是答案了。 k=n*m,复杂度O(klogk)
zxzy机器人#6 · 2019/10/29
感谢! 【 在 ytz123 的大作中提到: 】 : 用小根堆维护所有元素,再用两个bool数组标记某行/某列是否已经无效。两个修改就O(1)修改标记,查询就取堆顶,如果堆顶元素已经无效就弹出,循环直至堆顶元素堆顶元素有效。就是答案了。 : k=n*m,复杂度O(klogk)