给你两个1e5的序列问两个序列所有的数合并后总共N^2个数中前N个数的大小
我们先对数组进行排序,得到两个有序的数组AB
之后我们再把A[1]+B[1].A[1]+B[2],…,A[1]+B[N]这样的得出N个有序数列每个数列有N项
接着我们开一个优先队列把这个矩阵中第一列放进去,然后每次拿出最小的后,把那一行后一列加入到优先队列中,最终NlogN解决
1 |
|
给你两个1e5的序列问两个序列所有的数合并后总共N^2个数中前N个数的大小
我们先对数组进行排序,得到两个有序的数组AB
之后我们再把A[1]+B[1].A[1]+B[2],…,A[1]+B[N]这样的得出N个有序数列每个数列有N项
接着我们开一个优先队列把这个矩阵中第一列放进去,然后每次拿出最小的后,把那一行后一列加入到优先队列中,最终NlogN解决
1 | #include <bits/stdc++.h> |
SPFA变负权跑最短路即可(dij不行)
1 | #include <bits/stdc++.h> |
题目大多数都是给你一张图让你求其中两点见所有通路上边权最小值最大或者最大值最小的值
首先我们分析直接暴力去做那是肯定不可以的,数据一多就会T如果给定一张图的话可以用堆优化的dij能保证NlogN复杂度
边权最小值最大
我们分析一下最初的dij+堆优化的思路就是从终点开始,小根堆维护当前最小的dis然后用它去递推下面的dis答到最优更新的目的。
也就是dis[当前点]=min(dis[当前点],dis[之前的点]+边权值)
这里我们也是那种递推的思想
f[当前点]=min(f[当前点],max(边权值,f[之前的点]))
这个递推式实际上有点最大连续子区间的感觉
1 | //poj 2253(1~2之间所有路径上边权值最大的最小值) |
1 | // poj 1797(1-n所有路径上边权值最小值最大注意要用大根堆) |
线段相交并查集,注意线段相交模板
1 | #include <bits/stdc++.h> |
题目链接
这题我也是服了,我比赛的时候都没发现可以放在实数点上,以为圆心只能在x为整数的点上
算法上就是计算出当前点所能画出的圆心的最左边到最右边的区间之后就是那种线段相交包含的感觉了
1 | #include <bits/stdc++.h> |