热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2021年第44周总结

2021年第44周总结11.1判断线段相交问题解决计算几何中判断两个直线相交问题,通过矢量叉乘判断向量的相对位置,叉乘也可判断凸包等。博客Le
2021年第44周总结

11.1


判断线段相交问题

解决计算几何中判断两个直线相交问题,通过矢量叉乘判断向量的相对位置,叉乘也可判断凸包等。

博客

LeetCode 335

CF 751


Problem D

此题属于BFS中边数较多的情况,尝试采用删点的方法降低时间复杂度,删除后某些点将不会被搜索到。

可以使用Set维护待搜索的点集合。

思路&难点:Set优化的BFS。

LC No.265


Probelm D

编辑距离超级加强版。

一开始考虑dp[i][j]dp[i][j]dp[i][j]为布尔型是否匹配,后来发现其具有后效性,因此该方法不行,DP在设计状态的时候首先考虑是否有无后效性。

新的DP方法,通过前推少量状态而不是枚举状态减少常数。

定义dp[i][j]dp[i][j]dp[i][j]为匹配到s1[i]s1[i]s1[i]s2[j]s2[j]s2[j]的不产生冲突可能的剩余差值(由通配符产生)。

通过枚举dp[i][j]dp[i][j]dp[i][j]的状态去推出后继的状态。

其分为两种情况:

  • 追加差值
  • 匹配差值

分类讨论即可。

思路:二维DP。
难点:选择合适的DP状态解决后效性。

11.2


CF 751


Problem E

可以看做是模板题。给定两个数组,aaa的相对位置不变,bbb以任意顺序插入到aaa中,求最小逆序对。

首先需要证明两个结论:

  1. bbb一定以从小到大的相对顺序进行插入,证明显然。
  2. bib_ibi的插入的最优性互相独立互不影响。

第二点的证明,假设bib_ibiaja_jaj的前面插入对逆序对的贡献是最少的,那么我们知道,aj>bia_j>b_iaj>bibib_ibi插在aja_jaj后面,则会多产生一个逆序对,并且小于bib_ibibbb也不会产生更大的贡献。

首先的一个思路从寻找b1b_1b1的最优插入位置p1p_1p1,这需要O(n)O(n)O(n)的时间,在p1p_1p1之后查找p2p_2p2的位置,这需要O(n)O(n)O(n)时间,总共需要O(nm)O(nm)O(nm)的时间。如果我们使用分治,每次查找bmidb_{mid}bmid的最优位置,每一层需要O(n)O(n)O(n)的时间,总共需要O(nlog⁡m)O(n\log m)O(nlogm)

最后树状数组统计逆序对的个数,然后统计即可,时间复杂度O((n+m)log⁡(n+m))O((n+m)\log (n + m))O((n+m)log(n+m))

思路:贪心证明+分治。
难点:分成子问题优先考虑分治。

CF 752


Problem E

结论题 + 贡献转移。

考虑简化这个过程&#xff0c;能够得到一些有用的结论&#xff0c;即若ai&#43;1ai&#43;1<ai&#xff0c;那么最终ai&#61;⌊a⌈aiai&#43;1⌉⌋a_i&#61;\lfloor \frac{a}{\lceil \frac{a_i}{a_i &#43; 1} \rceil} \rfloorai&#61;ai&#43;1aia&#xff0c;并且需要⌈aiai&#43;1⌉−1\lceil \frac{a_i}{a_i &#43; 1} \rceil - 1ai&#43;1ai1次拆解。

那么我们可以枚举以xxx结尾&#xff0c;前驱为ai&#43;1a_i &#43; 1ai&#43;1⌈aiai&#43;1⌉−1\lceil \frac{a_i}{a_i &#43; 1} \rceil - 1ai&#43;1ai1贡献。设dp[i][x]dp[i][x]dp[i][x]表示为子数组a[i:j]a[i:j]a[i:j]最终以xxx结尾的子数组的数量&#xff0c;那么前面有iii个开头的子数组会得到这个贡献。即为i∗dp[i][x]∗(⌈aix⌉−1)i * dp[i][x] * (\lceil \frac{a_i}{x} \rceil - 1)idp[i][x](xai1)

思路&#xff1a;推结论&#43;贡献转移。
难点&#xff1a;推出结论&#43; DP状态设计 &#43; 贡献转移技巧。

11.3


LC 407

优先队列的优化的BFS搜索题。

我们假设一个小人在(r,c)(r,c)(r,c)向四周倒水&#xff0c;优先队列中有三元组(r,c,hei)(r,c,hei)(r,c,hei)&#xff0c;表示小人在(r,c)(r,c)(r,c)向四周倒水的最大高度为heiheihei

首先我们可以确定一开始小人应该站在边界处&#xff0c;故将所有的边界加入到队列中。

每次队列取出heiheihei最小的&#xff0c;向四周倒水&#xff0c;如果(dr,dc)(dr,dc)(dr,dc)的高度低于heiheihei&#xff0c;那么肯定是可以倒水的高度为heiheihei的&#xff0c;因为(dr,dc)(dr,dc)(dr,dc)的短板一定是(r,c)(r,c)(r,c)。然后(dr,dc)(dr,dc)(dr,dc)heiheihei就可以确定&#xff0c;即max⁡(hei,height[dr][dc])\max(hei,height[dr][dc])max(hei,height[dr][dc])&#xff0c;将其加入优先队列中。

思路&难点&#xff1a;优先队列维护的BFS。

11.5


21 CCPC for Female


Problem C

一开始ych告诉我将分公司的数量为111和大于111进行分类&#xff0c;为111的就不要赋予状态。

正解为传递闭包优化DAG上的DP。

考虑带中间节点的路径i→ji \to jij&#xff0c;那么若有边(i,j)(i,j)(i,j)存在&#xff0c;那么以这条边转移的DP一定是不优的&#xff0c;所以可以删掉这个边。

为了维护节点ijijij之间是否有带中间节点的路径&#xff0c;需要求一次DAG的传递闭包。

这样操作之后&#xff0c;可以证明带有nnn个节点的DAG图最多有n−1n-1n1个边。即1→n1 \to n1n的一条链。

这样时间复杂度就从O(n2)O(n^2)O(n2)的完全图优化为O(n)O(n)O(n)的链图。

思路&#xff1a;DAG上的DP。
难点&#xff1a;用传递闭包优化DAG的DP。

Problem B

倍增&#xff0c;一个很显然的思路&#xff0c;在字符串sss上查询&#xff0c;从s[0]s[0]s[0]s[k1]s[k_1]s[k1]正好凑齐一组字母表&#xff0c;从s[k1&#43;1]s[k_1 &#43; 1]s[k1&#43;1]s[k2]s[k_2]s[k2]正好凑齐一组字母表&#xff0c;结果正好能最多凑齐ppp个字母表&#xff0c;那么关于sss的答案即为p&#43;1p&#43;1p&#43;1

考虑dp[i][k]dp[i][k]dp[i][k]为从起点iii2k2^k2k次的中点。首先通过一次二分计算出dp[i][0]dp[i][0]dp[i][0]&#xff0c;然后进行倍增求出所有的dp[i][k]dp[i][k]dp[i][k]即可。

单次查询时的时间复杂度为O(log⁡n)O(\log n)O(logn)

思路&难点&#xff1a;二分&#43;倍增DP。

11.6


21 CCPC for Female


Problem F

POJ 2185的增强版本 广义KMP&二维KMP的模板题&#xff0c;只不过需要一次Hash来优化字符串的判断相等。

思路&难点&#xff1a;二维KMP&#43;Hash优化。

11.8


ABC 226


Problem F

一道分拆数估计&#43;DFS枚举分拆&#43;第一类斯特林数&#43;划分模型的一道综合计数题。

首先根据P50<1e6P_{50} <1e6P50<1e6&#xff0c;确定DFS枚举分拆可行。

然后DFS枚举分拆&#xff0c;在可能的答案中对分拆组转换为划分组&#xff0c;最后根据公式S(n,1)&#61;(n−1)!S(n,1) &#61; (n - 1)!S(n,1)&#61;(n1)!对其进行计数。

思路&#xff1a;组合数学。
难点&#xff1a;计算公式的确定。


推荐阅读
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文讨论了读书的目的以及学习算法的重要性,并介绍了两个算法:除法速算和约瑟夫环的数学算法。同时,通过具体的例子和推理,解释了为什么x=x+k序列中的第一个人的位置为k,以及序列2和序列3的关系。通过学习算法,可以提高思维能力和解决问题的能力。 ... [详细]
author-avatar
淑圣承琦9_416
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有