这里是本人在 LOJ 上刷的一本通题目的综合题解,不定时更新。具体更新策略 戳这儿.
如果题目较简单,则本人会 简略地阐述思路等,然后 根据具体需要,给出伪代码,贴链接全代码,或不给代码。 注释较少或没有。
如果题目较有思维难度,则本人会 详细地讲解解题过程,然后 给出伪代码 或 帖链接全代码。 注释较少。
如果题目较有码量,则本人会 粗略地讲解策略,但侧重于讲解实现方式,给出 帖链接全代码 或 直接贴全代码。 注释较多。
如果题目既有思维难度,又有码量,则本人会 详细讲解解题过程,并讲解实现方式,给出 贴链接全代码 或直接贴全代码。 注释较多。
以上内容,特此说明。但总会阐明简要题意,分析时间复杂度等。且如果内容实在过多,会考虑分支题解。
如果本人水平能解决数据加强的情况,会竭力讲数据加强。数据加强表示本人的程序可以实现的较大水平。
第一部分 基础算法
贪心算法
简要题意:给定若干 左闭右开 的区间 [ s i , f i ) [s_i , f_i ) [si,fi),求最多的区间数使得它们两两没有交集。
显然,用 pair \text{pair} pair 数组将这些区间排序,然后用 last \texttt{last} last 记录上一次取的区间末尾(初始为 0 0 0).
从小到大取,如果能取,则 a n s ← a n s + 1 ans \gets ans+1 ans←ans+1,并更新 last \texttt{last} last.
时间复杂度: O ( n log n ) O(n \log n) O(nlogn). 数据加强: n ≤ 1 0 6 n \leq 10^6 n≤106. 实际得分: 100 p t s 100pts 100pts.
简要题意:有 h h h 个要求,每个要求即 [ l , r ] [l,r] [l,r] 区间中种上 e e e 棵树。求满足所有条件的最少种数棵树。
显然,结构体存储要求并按结尾排序。然后,尽量多的在区间末尾种树,因为这样可以对后面的区间造成较大贡献。
时间复杂度: O ( n × h ) O(n \times h) O(n×h). 实际得分: 100 p t s 100pts 100pts.
数据加强: n , h ≤ 1 0 6 n,h \leq 10^6 n,h≤106,用线段树维护种树过程,有诸多细节。
简要题意:
给定一个 l × w l \times w l×w 的草坪和 n n n 个喷头,每个喷头的圆心都在中线上,离左边 L L L 米,浇灌范围 W W W 米。求最少的喷头能浇灌整个草坪。
仍然,用 pair<double,double> \text{pair<double,double>} pair<double,double> 存储,计算当前喷头能浇灌到的 最左位置和最右位置 。
然后,按照 LOJ #10000. 「一本通 1.1 例 1」活动安排 的思路解决即可。
注意判断 − 1 -1 −1 的情