首页 > 其他分享 >LC1782 统计点对的数目

LC1782 统计点对的数目

时间:2023-08-24 16:23:02浏览次数:48  
标签:right left int LC1782 queries 指针 数目 统计 deg

隐藏在图论里的双指针问题。

一个很容易想到的思路是,枚举每一条边,算出各个点的入度 \(deg_i\),同时用哈希表统计重边数量;然后,对于每个询问,枚举点对,求出 \(deg_x+deg_y-重边数量\)。这样做的复杂度是 \(O(m+qn^2)\),怎么优化?

关注这个复杂度中的 \(n^2\),它所做的事情可以抽象为:统计在 \(deg\) 数组中,有多少个数对的和大于 \(queries_i\)——不难发现,这可以通过排序+双指针解决。从大到小排序 \(deg\),如果当前 \(deg_{left}+deg_{right}>queries_i\) 成立,那么左指针处在当前左指针(含)到右指针之间的所有位置时,这一条件都成立,答案增加 \(right-left\),右指针左移 \(1\);否则左指针右移 \(1\)。

去重方式也要随之改变:在完成双指针枚举后,我们枚举每一条边进行检查,如果 \(deg_x+deg_y>queries_i\),但是 \(deg_x+deg_y-重边数量<queries_i\),则答案减 \(1\)。

最终的时间复杂度是 \(O(m+q(n\log n+n+m))\)。

下面是 AC 代码:

func countPairs(n int, edges [][]int, queries []int) []int {
    deg := make([]int, n+1)
    type edge struct{ x, y int }
    cntE := map[edge]int{}
    for _, e := range edges {
        x := e[0]
        y := e[1]
        if x > y {
            x, y = y, x
        }
        deg[x]++
        deg[y]++
        cntE[(edge{x, y})]++
    }
    answer := make([]int, len(queries))
    sortedDeg := append([]int(nil), deg...)
    sort.Ints(sortedDeg)
    for i, q := range queries {
        left, right := 1, n
        for left < right {
            if sortedDeg[left]+sortedDeg[right] <= q {
                left++
            } else {
                answer[i] += right - left
                right--
            }
        }
        for e, c := range cntE {
            s := deg[e.x] + deg[e.y]
            if s > q && s-c <= q {
                answer[i]--
            }
        }
    }
	return answer
}

THE END

标签:right,left,int,LC1782,queries,指针,数目,统计,deg
From: https://www.cnblogs.com/th19/p/17654378.html

相关文章

  • Leetcode 1782. 统计点对的数目
    这两天实训比较忙,之后补TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussianChineseTraditionalIndonesianSlovakCzechItalianSlovenianDanishJapane......
  • elementUI使用echarts的空气质量地图统计
    准备工作:前端安装:yarninstallecharts 、 yarninstallvue-baidu-map--save前端在public文件夹下的index.html中head标签中加入:<scriptsrc="https://api.map.baidu.com/api?v=2.0&ak=你的AK"></script>其中,key的申请地址:https://lbsyun.baidu.com/apiconsole/k......
  • ffmpeg 切分音频视频,统计音频时长
    #audiodurationdefmake_duration(file_path):result=sp.run(["ffprobe","-v","error","-show_entries","format=duration","-of",......
  • Python 读取文件并统计单词出现次数
    ##py_count_words.py#py_learn##CreatedbyZ.Steveon2023/8/2310:30.#importrefromcollectionsimportCounterdefcount_words(text):#使用正则表达式将文本拆分为单词words=re.findall(r'\b\w+\b',text.lower())#转换为小写以进行不......
  • 统计和小于目标的下标对数目
    给你一个下标从0开始长度为n的整数数组nums和一个整数target,请你返回满足0<=i<j<n且nums[i]+nums[j]<target的下标对(i,j)的数目。示例1:输入:nums=[-1,1,2,3,1],target=2输出:3解释:总共有3个下标对满足题目描述:(0,1),0<1且nums[0]+nu......
  • 使用python统计git仓库中频繁修改的热点函数
    本篇博客以开源代码RT-Thread为例,描述了如何使用python扫描统计代码中频繁修改的函数,帮助我们发现系统中需求变化和BUG制造的重灾区。需求背景最近在学习设计模式时,印象深刻的一句话就是“要将设计模式应用在不稳定、频繁修改的地方,在变化处应用招式”,那么什么样的地方是频繁......
  • 统计数据源(NLP/AI/ML): Indeed.com(全球超过60个市场28种语言的招聘站:可视化统计数
    Indeed.com:全球招聘站可视化统计数据:(全球超过60个市场28种语言的招聘站:可视化统计数据https://www.hiringlab.org/data/)Indeedhaswebsitesinover60marketsand28languages.Thefulllistofmarketsishere:https://www.indeed.com/worldwide.Wehaveeconom......
  • java应用接口自动化覆盖率统计实践
    一、背景Java应用接口自动化覆盖率统计的意义在于:确保测试覆盖率:通过自动化覆盖率统计,可以确保测试用例对应用程序的各个接口进行了全面的覆盖。这有助于发现潜在的代码错误、逻辑漏洞或者未处理的异常情况。提高代码质量:通过自动化覆盖率统计,可以发现代码中未被测试到的部......
  • java-sdk接口测试覆盖率统计实践
    一、背景接口覆盖率统计在JavaSDK开发中具有重要的意义。它衡量了代码中接口被测试用例覆盖的程度,即测试用例对接口的执行情况进行了多少次验证。接口覆盖率统计的意义包括:质量保证:接口覆盖率统计可以帮助开发团队评估测试的全面性和质量,确保代码的正确性和稳定性。高覆盖率......
  • 范围中美丽整数的数目
    给你正整数low,high和k。如果一个数满足以下两个条件,那么它是美丽的:偶数数位的数目与奇数数位的数目相同。这个整数可以被k整除。请你返回范围[low,high]中美丽整数的数目。1.数位dpclassSolution{public:intcalc(intnum,intk){strings......