清北学堂2019.7.14
Day 2 林永迪
首先,先将了一波昨天没讲完的贪心。。。
过河问题:
首先,经过总结,发现应该让最慢的两个人一起过河
不妨先设a,b,c,d速度由快到慢,则有两种情况
- ac a ad a ————> c+d+2*a
- ab a cd b ————> d+2*b+a
这两种求一个min就可以了(其实只与b,c的大小有关)
还有另外一种更为玄学的方法——k搜索
然后便是分治算法了
先介绍一下二分(屠龙宝刀点击就送)
首先是NOIP2012借教室
这个题在之前好像线段树会卡掉(毕竟之前的老年机。。。)
然后呢,显然是二分
一会看连接吧qwq
然后是三分(一般是单峰函数)
比较实数:double eps=1e-8
多峰的函数把他切割成好多好多个单峰函数,然后跑三分。。。(这是什么操作)
分块
- 将区间分为√n那么就会有三种情况(在[l,r]打tag标记)O(n√n)
- 分块(块大小√n),若两个数在同一块中,则暴力遍历,A数组是原数组,B数组是每一块(经过排序后)的数组。若不在同一块中,则只需遍历块,然后跑一个二分,答案相加,两端跑暴力(O(√n log n +2√n))若加一个数,则在A数组上加那个数,然后在B数组排序就行了
- 一个long long范围的数最多被开方六次
color[i]:表示下标为i的球的颜色
pre[i]:表示前一个颜色为color[i]的球的下标
若pre[i]<x<i,则[x,i]区间内只有一种颜色为color[i]的球
所以只用查询[l,r]里所有pre[i]<l的i的个数即可
修改颜色的话,只需要暴力维护某个颜色的数组,再造一个类似于链表的东西就可以了
深度优先搜索(dfs)
深搜,电风扇,大法师,回溯
是自己欺骗自己的好东西(滑稽)
较多用于走迷宫和树的遍历中(以及大名鼎鼎的网络爬虫)
虽然要利用栈进行递归但是不可思议地空间依旧比广搜小
一般结合强力的剪枝服用时有奇效
由于不需要搜索完所有的节点也能出一些结果,故在骗分界有广泛的好评
在寻找最优解的问题上基本被广搜吊打
(能写循环写循环,因为搜索复杂度过大)
杀人放火,居家常备,解决最优性问题有两把刷子
擅长答案在搜索树比较浅的位置时的情况
虽然名字叫广度优先搜索,但其实并不喜欢很宽的搜索树
状态的表示并没有深搜来的舒服
并没有很好的剪枝策略,垃圾节点一大堆
空间上完全被锤爆了,可以说是一点都没有考虑过内存的想法
双向广搜可以去掉一些垃圾结点(比广搜更优)
迭代加深搜索:
下午就变成了数论qwq
高精除法(高精除以高精)
因为计算机无法试除,所以用减法,能减就减
高精度开方
首先将数字按两位两位的分开(小数点为界)
然后是快速幂,矩阵快速幂,高斯消元,筛法
div是整除
晚上来讲讲BFS(best first search???)
BFS——Breath First Search : 宽度优先搜索
BFS——Best First Search : 贪心搜索
BFS + BFS = ?
启发式搜索相较于其他的搜索的优势在于引入了一个启发式函数f(x) = g(x) +h(x)
g*(x) : 从 S 到 x 的理论最近距离
g(x) : 对 S 到 x 对于 g*(x) 的估计
f*(x) : 从 x 到 T 的理论最近距离
f(x) : 从 x 到 T 对于 f*(x) 的估计
h(x):理想的最短距离
h*(x):实际最短距离
当满足 f(x) <= f*(x) 时,总能找到最优解
BFS + BFS = A*↑
A* 算法的流程↓
和 BFS 几乎一样,只是每次都弹出当前局面中f(x)最小的那个局面进行扩展
——故需要维护一个优先队列
——使用系统的priority_queue<>即可
当 f(x) = g(x) + h(x) 中 h(x) = 0 即失去了启发式函数,则变为Breath First Search
当 f(x) = g(x) + h(x) 中 g(x) = 0 则变为 Best First Search
第一次到终点时输出g(x)即可
↑算是逆元知识