国庆day1补题
单调数据结构
单调栈的性质:
1.单调栈里的元素具有单调性
2.元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除
3.使用单调栈可以找到元素向左遍历第一个比他小的元素,也可以找到元素向左遍历第一个比他大的元素,具体的,假设要找到一个元素向前第一个比它大的数,就是维护单调减的单调栈,加入一个数弹到最后时的前面那个数(这个数不再弹出)。向后第一个比它
单调队列相当于另外又维护了一个下标(或别的)可以从开头删除元素
CF280B Maximum XorSecondary
题意:
给出一个长为n的正整数序列。定义一个序列的所有数异或的结果为其最大值和次大值的异或值。求在此序列的所有子串(即要求连续一段区间)中价值最大是多少。
第一行一个整数n(\(1≤n≤10^5\)),表示序列长度。
第二行n个由空格隔开的正整数\(s_i\)((\(1≤s_i≤10^9\))),为序列元素。
输出仅一个整数,即最大异或和。
题解:
不妨枚举所有可能出现的最大值和次大值,由于若以最大值枚举的话难以计算(因为对应一个最大值的话次大值有很多种可能),所以我们枚举次大值,具体的说就是遍历数组 \(a_i\) ,每个数为一个区间次大值时,最大值只可能是前面第一个比这个数大的数或后面第一个比这个数大的数,这样可以进行单调栈。
容易发现把这个数弹出的数就是第一个它大的数。
CF1407D Discrete Centrifugal Jumps
题意:
有 \(n\) 个高楼排成一行,每个楼有一个高度 \(h_i\)。称可以从楼 \(i\) 跳到 楼 \(j\),当 \(i\), \(j\) ( \(i < j\) )满足以下三个条件之一:
-
\(i+1=j\)
-
\(\max(h_{i+1},h_{i+2},\cdots,h_{j-1})<\min(h_i,h_j)\)
-
\(\min(h_{i+1},h_{i+2},\cdots,h_{j-1})>\max(h_i,h_j)\)
现在你在楼 \(1\),请求出跳到楼 \(n\) 最少要跳几次。
\(2 \leq n \leq 3\cdot 10^5\), \(1\leq h_i \leq 10^9\)。
题解:
显然dp,考虑如何转移,第一点显然是 \(dp[j-1]+1\) 对 \(dp[j]\) 有贡献,第二项和第三项本质一样,考虑第二项,意思是中间的所有元素都小于两边的这俩元素,假设目前正在计算\(dp[j]\) ,考虑可以从哪个点来转移,
- 如果\(h_i\le h_j\),那么说明\(h_j\)是\(h_i\)后第一个比\(h_j\)大或等于的数,这用性质三,用单调递减的单调栈维护即可,每次有弹出的数都是贡献的一部分
- 对于\(h_i > h_j\),着说明了\(i\)只能取 \(j\)之前第一个比 \(j\)大的位置,同样可以用单调栈来维护
具体来说维护一个单调递减的单调栈,每次弹出去的所有比\(h_j\)小或等于的数计算贡献,如果中间没有弹出等于的数,那么对前一个数也计算贡献(因为如果有等于的数,就无法满足均大于中间的数(注意单调栈中不可能出现两个等的数,因为单调递减))。
[ABC352D] Permutation Subsequence
题意:
给你一个 \(1 \sim N\) 的排列 \(P\)。
长度为 \(K\) 的索引(位置)序列 \((i_1,i_2,\dots,i_K)\) 如果同时满足以下两个条件,则称为好索引序列:
- \(i\) 从 \(1\) 到 \(K\) 单调递增。
- 子序列 \((P_{i_1},P_{i_2},\ldots,P_{i_K})\) 可以在重新排列后成为 \(K\) 个连续的整数。
求所有好的索引序列中 \(i_K-i_1\) 的最小值。可以证明,好索引序列存在至少一个。
题解:
比较容易,可以先做一个映射,记录\([1,n]\)每个数出现的位置,可以知道我们的这个序列出现于这个映射后的一段长度为\(k\)的连续区间里,额,求\(i_k-i_1\)的min值,这就是标准的滑动窗口。
CF1195E OpenStreetMap
题意:
给定一个 $ n\times m $ 的矩阵 $ h $ ,求出所有大小为 $ a\times b $ 的子矩形中的最小值的和.
题解:
单调队列好题,注意二维的转化,假设我们要求以\((i,j)\)为左上顶点进行讨论,考虑这个min值的性质,显然可以拆成这个a行每一行的min然后再min,于是我们就可以对于这个矩阵每一行进行滑动窗口,得出一个新的矩阵,代表每个数往后\(b\)长度的min值,然后再以纵列做一次滑动窗口,求这a行的min就解决问题了。
贪心
一种很意识流的想法,但对问题进行详细分析便可得出策略,有两类常用方法:
- 归纳法:每一步都保证是最优解
- exchange argument:交换两步操作,答案不会更优(简单来说)
[NOIP2012 提高组] 国王游戏
略
题解:
我们考虑交换相邻的两个对于结果的影响,假设交换前为\((j,i)\),交换后为\((i,j)\),假设交换后更劣,则:
\[\max(\frac{c}{b'_i},\frac{ca'_i}{b'_j})> \max(\frac{c}{b'_j},\frac{ca'_j}{b'_i}) \]考虑若要满足这个式子,则会出现两种情况:
\[\frac{c}{b'_i}>\frac{c}{b'_j}\& \frac{c}{b'_i}>\frac{ca'_j}{b'_i} \]\[\frac{ca'_i}{b'_j}>\frac{c}{b'_j}\& \frac{ca'_i}{b'_j}>\frac{ca'_j}{b'_i} \]两个都可以进行化简:
\[b'_j<b'_i\& a'_j<1 \]\[a'_ib'_i>a'_jb'_j\& a'_i>1 \]第一种情况因为\(a\)的数据范围不可能所以舍去,然后就发现我们要满足\(a'_ib'_i>a'_jb'_j\),这样如果交换不劣,所以按\(a'_ib'_i\)从小到大排序即可。
CF1552E Colors and Intervals
题意:
\(n \times k\) 个格子,编号从 \(1\) 到 \(n \times k\),染成 \(n\) 种颜色,每种颜色恰好 \(k\) 个。
构造 \(n\) 个区间,第 \(i\) 个区间 \([a_i, b_i]\) 满足
- \(1 \le a_i < b_i \le n \times k\)
- 第 \(a_i\) 个和第 \(b_i\) 个格子的颜色都是 \(i\)。
- 每个格子被包含不超过 \(\lceil \frac{n}{k-1} \rceil\) 次。
题解:
可以有一个妙的想法,构造出来机组划分,每一组划分里面的区间互不相交,每个划分包含k-1个区间,这样绝对可以满足第三个条件。
考虑每一组内该如何考虑:
使用贪心,假设当前已经在这一组中前面的已经划分出来,后面我们选择r端点最小的满足\(c_l=c_r\)的元素,可以证明,一定可以取够\(k-1\)个区间。、
证明也是妙妙:
可以看luogu题解
倍增
不想写了
分治
不想写了
标签:frac,min,题解,元素,day1,国庆,补题,序列,单调 From: https://www.cnblogs.com/huanghezhe/p/18512744