摘要: 若一个数在一段区间内作为最大值存在,那么答案应该加上这个数 若一个数在一段区间内作为最小值存在,那么答案应该减去这个数 所以我们利用单调栈,高效求出a[i]在哪个区间内作为最大/最小值存在,从而确定,加/减多少次a[i],最终得到答案 #include<stdio.h> #include<math. 阅读全文
posted @ 2018-01-30 15:07 声声醉如兰 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 利用单调栈,高效求出每个区间内的最大值和次大值的亦或值。 先正向扫描,利用单调递减栈,若当前栈为空栈,则直接压入栈中,若为非空栈,弹出栈顶元素,每弹出一个元素,则求一次亦或值,保留最大值 接着进行反向扫描,过程与上相似。 #include<stdio.h> #include<math.h> #inc 阅读全文
posted @ 2018-01-30 10:38 声声醉如兰 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 利用单调栈高效的求出,一个数a[i]在哪个区间内可作为最小值存在。 正向扫描,求出a[i]可做为最小值的区间的左边界 反向扫描,求出a[i]可作为最小值的区间的右边界 r[i] - l[i] +1 就是a[i]可作为最小值的区间的 最大长度 我们知道:长度为len的区间,包含长度为len-1的区间 阅读全文
posted @ 2018-01-30 10:14 声声醉如兰 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 分治 #include<stdio.h> #include<math.h> #include<cstring> #include<stack> #include<iostream> #include<algorithm> #include<queue> #define MAXSIZE 100005 阅读全文
posted @ 2018-01-30 09:37 声声醉如兰 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 若a[i]-i(i从1开始)的值小于0,那么a[i]必须改变 若a[i]-i的值大于等于0,将a[i]-i存入新的数组中,求出新数组的最长非严格上升子序列,所得即最多的,不用改变的数。 #include<stdio.h> #include<math.h> #include<cstring> #inc 阅读全文
posted @ 2018-01-30 09:18 声声醉如兰 阅读(243) 评论(0) 推荐(0) 编辑