1.
(1)给n个数,找到长度至少为k的段,使得平均数最大
(2)给n个数,找到长度至少为k的段,使得中位数最大
二分答案,数组处理,前缀和,区间最小
2.
(1)给n个数,相邻元素至少选一个,使得平均数最大
(2)给n个数,相邻元素至少选一个,使得中位数最大
二分答案,数组处理,状态机
3.实数二分最好二分次数(100次),或者相对精度
4.给定一棵树,点有点权,切k刀,使得最大权值连通块的最小值
树形dp,二分,贪心
5.P2824 [HEOI2016/TJOI2016]排序 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
(如果m很小的话其实可以对每次询问都模拟一遍,即常用思路是:询问的时候再根据询问操作)
对于每次询问,二分答案,修改数组,问题变为区间统计与区间赋值
由于有n次询问,因此每次询问回答的复杂度只能是O(logn)左右
积累:很多排序都是可以往这方面想(排序转为01序列)
6.动态开点,扫描线,线段树分裂
7.给n条直线,问交点横坐标第k大的坐标
8.P3527 [POI2011]MET-Meteors - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
9.遇到某个数在区间中只出现一次,只需预处理出该数的前一次出现和后一次出现即可。
10.区间计数问题一般都可使用扫描线解决
11.紫书:
12.滑动窗口与单调队列:
一般用来维护长度固定的区间的某种性质,如和,乘积等。配合二分使用可以改变区间长度;配合set,数组等可以维护区间内每个数的出现次数;配合单调队列可以维护区间内最大值和最小值。
单调队列一般用于维护滑动区间中最大值,最小值。但不可维护区间中的递增元素的个数。
13.双指针:
14.支持删除任意元素的优先队列:
1)具体的做法是:
维护两个优先队列,一个是最值队列,一个是删除队列。
当然还有一个普通的队列,就是模拟题目本身的数据插入和删除的。
①对于插入,首先是插入普通的队列,然后插入优先队列
②对于删除,是删除普通的队列头元素,然后把这个头元素插入到删除队列中
③对于求最大值,就稍微麻烦一点点了,我们要结合删除队列和最值队列。
由于两个队列都是优先队列,所以两者里面的内容也都是有“顺序关系”的,只要按从队首的顺序开始判断,就能找到最大值。
2)具体的判断是:如果删除队列的首元素和最值队列的首元素相等,就表明最值队列的首元素要删除,所以同时删除最值队列和删除队列的这个元素,重复这个步骤,知道他们首元素不同,或者一个队列为空。
3)理解:其实本质上就是由于优先队列只能从让最值元素出队,那么我们就维护一个性质,当最大元素满足这个性质时出队就可以了
15.计算数组中每个数前面有多少个数大于自己可以用离散化线段树。
16.树状数组
17.set,map自带lower_bound函数,在有序的数组中查询,插入,删除可以使用set,map
18.前缀和