首页 > 其他分享 >图论-堆-并查集-2503. 矩阵查询可获得的最大分数

图论-堆-并查集-2503. 矩阵查询可获得的最大分数

时间:2022-12-13 00:00:30浏览次数:65  
标签:图论 单元格 查集 List len edges grid queries 2503

2503. 矩阵查询可获得的最大分数

Description

Difficulty: 困难

Related Topics:

给你一个大小为 m x n 的整数矩阵 grid 和一个大小为 k 的数组 queries

找出一个大小为 k 的数组 answer ,且满足对于每个整数 queres[i] ,你从矩阵 左上角 单元格开始,重复以下过程:

  • 如果 queries[i] 严格 大于你当前所处位置单元格,如果该单元格是第一次访问,则获得 1 分,并且你可以移动到所有 4 个方向(上、下、左、右)上任一 相邻 单元格。
  • 否则,你不能获得任何分,并且结束这一过程。

在过程结束后,answer[i] 是你可以获得的最大分数。注意,对于每个查询,你可以访问同一个单元格 多次

返回结果数组 answer

示例 1:

输入:grid = [[1,2,3],[2,5,7],[3,5,1]], queries = [5,6,2]
输出:[5,8,1]
解释:上图展示了每个查询中访问并获得分数的单元格。

示例 2:

输入:grid = [[5,2,1],[1,1,2]], queries = [3]
输出:[0]
解释:无法获得分数,因为左上角单元格的值大于等于 3 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 2 <= m, n <= 1000
  • 4 <= m * n <= 105
  • k == queries.length
  • 1 <= k <= 104
  • 1 <= grid[i][j], queries[i] <= 106

Solution

  • 解法一:堆
    用堆维护一下即可。
    Language: Python3
class Solution:
    def maxPoints(self, grid: List[List[int]], queries: List[int]) -> List[int]:
        m, n = len(grid), len(grid[0])
        res = [0] * len(queries)
        h = [(grid[0][0], 0, 0)]
        grid[0][0] = 0
        cnt = 0 
        for idx, q in sorted(enumerate(queries), key=lambda x: x[1]):
            while h and h[0][0] < q:
                cnt += 1
                _, i, j = heappop(h)
                for x, y in (i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1):
                    if 0 <= x < m and 0 <= y < n and grid[x][y]:
                        heappush(h, (grid[x][y], x, y))
                        grid[x][y] = 0
            res[idx] = cnt
        return res


  • 并查集
    将原问题转为图论问题,需要定义好节点和边。
    节点:每个位置就是一个节点,节点编号\(i * n + j\)
    边:两个节点的max
    查询的过程就是不断merge节点的过程,用并查集维护一下连通图的大小即可。
class Solution:
    def maxPoints(self, grid: List[List[int]], queries: List[int]) -> List[int]:
        m, n = len(grid), len(grid[0])
        mn = m * n

        edges = []
        for i in range(m):
            for j in range(n):
                if i: edges.append((max(grid[i][j], grid[i - 1][j]), i * n + j, (i - 1) * n + j))
                if j: edges.append((max(grid[i][j], grid[i][j - 1]), i * n + j, i * n + j - 1))
        edges.sort()

        fa = list(range(mn))
        size = [1] * mn

        def find(x):
            if fa[x] != x: fa[x] = find(fa[x])
            return fa[x]
        
        def union(x, y):
            fx = find(x)
            fy = find(y)
            if fx != fy:
                fa[fx] = fy
                size[fy] += size[fx]
        
        res = [0] * len(queries)
        j = 0
        for i, q in sorted(enumerate(queries), key=lambda x: x[1]):
            while j < len(edges) and edges[j][0] < q:
                union(edges[j][1], edges[j][2])
                j += 1
            if grid[0][0] < q:
                res[i] = size[find(0)]
        return res

标签:图论,单元格,查集,List,len,edges,grid,queries,2503
From: https://www.cnblogs.com/hyserendipity/p/16977494.html

相关文章

  • 现在有一个并查集,你需要完成合并和查询操作。
    输入格式:第一行包含两个整数N,M,表示共有N个元素和M个操作。接下来M行,每行包含三个整数zi,xi,yi。当zi=1时,将xi与yi所在的集合合并。当zi=2时,输出xi与yi......
  • CF723F st-Spanning Tree - 贪心 - 图论 -
    题目链接:https://codeforces.com/problemset/problem/723/F题解:首先先删去s和t,原图一定是若干个连通块,先把这些块的生成森林求出来,之后将连通块缩点然后考虑如何与s......
  • leetcode 6256. 将节点分成尽可能多的组 二分图判定+bfs+并查集
    6256.将节点分成尽可能多的组难度困难7收藏分享切换为英文接收动态反馈给你一个正整数 n ,表示一个 无向 图中的节点数目,节点编号从 1 到 n 。同时给你一个......
  • 并查集
    typedefstruct{ElementTypeData;intParent;//双亲表示法}SetType;intFind(SetTypeS[],ElementTypeX){inti;for(i=0;i<MaxSize......
  • POJ - 1308 Is It A Tree?(并查集)
    POJ-1308IsItATree?(并查集)题目大意:传送门对于每一组测试样例,给出若干条无向边,判断由这些无向边构成的图是否为无环连通图题目分析:要点1:无环联通图(树)的性质:边......
  • 离散数学左孝凌-图论1
    图的基本概念路与回路......
  • 【小航的算法日记】图论
    目录​​一、概念、模板​​​​存图方式:​​​​1.邻接矩阵​​​​2.邻接表​​​​3.类​​​​算法:​​​​拓扑排序:​​​​最短路问题:​​​​1.Floyd「多源汇最短路......
  • [模板] 并查集
    并查集structDSU{vector<int>fa,rk;explicitDSU(intn):fa(n+1),rk(n+1){for(inti=1;i<=n;i++)fa[i]=i;}......
  • [并查集 维护大小 全局输入]L2-007 家庭房产
    [并查集]L2-007家庭房产​​题目链接​​思路显然的并查集题目,感觉要维护挺多东西的维护集合最小编号,集合大小,集合房产套数,集合房产面积(人均的到时候除以下大小就完事了)......
  • 图论知识点全明星
    NOIP考前攒rp。图论是是数学的一个分支,图是图论的主要研究对象。图(Graph)是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特......