151021总结

来源:互联网 发布:095型核潜艇 知乎 编辑:程序博客网 时间:2024/05/16 10:18
T1
贪心,先对h进行排序,然后贪心地往最近或最远的平台跳即可
//注意判断边界


/*
当时我一看到这个题就觉得是dp,然后写了dp+单调队列优化 -_-|||
*/


需要的知识:贪心


T2
//这题方法多
①【线段树】
先将点离散化,将数学家们按照li排序,维护一个数组G,Gi=min{fi | lj = i},一开始将G设为无穷大,求fi的时候使用fi=min ri/j1 (Gj) +ci 求出后赋值Gli = min(Gli,fi),用树状数组或线段树维护G即可


②【最短路】——by lsh
先将点离散化,将每条线段的左右界建边,并在相邻点间建边权为0的反向边,跑一边最短路求出即可
用dijkstra + heap 实现 ,SPFA 会挂掉
//真机智


③【dp + 单调队列 + 二分查找】

//直接贴我写的题解。。。

对于 30% 的数据 m<=1000 ,可以考虑dp 。
先将所有数据按右边界排序 ,设 Fi 表示使X1 = X2 =……X r(i) 成立的最小花费,则有
Fi = min{ Fj } + c[i] ( r[j] >= l[i] )
时间复杂度 O ( M^2 )


对于 100% 的数据 m <= 100000 ,我们可以考虑优化这个方程
首先考虑维护一个单调队列,使得队列中的元素随着右界递增,花费单调递增,队列维护的就是使 X1 = X2 = …… =X r(i) 的最小花费
但因为左界是无序的,所以我们不能弹出队首元素
对于 j 来说 ,我们要找出的是满足 r[j] >= l[i] 的最小 F[j] ,而在队列中满足右界单增,花费单增,所以可以二分出 j


O(M*logM)


需要的知识:线段树 / dijkstra + heap / dp优化 + 二分


T3
//其实这题并不难想,就是好难写→→
正向单调不下降 → 反向单调不上升
所以可以用贪心的思想,反向确定,每次取最大就行了
但是有很多情况需要判(例如 3000
用dfs会很方便


需要的知识:贪心
0 0
原创粉丝点击