【模板】单调栈(P5788)
题目
题目描述:
给出项数为 的整数数列 。
定义函数 代表数列中第 个元素之后第一个大于 的元素的下标,即 。若不存在,则 。
试求出 。
输入格式:
第一行一个正整数 。
第二行 个正整数 。
输出格式:
一行 个整数表示 的值。
数据范围与说明:
【数据规模与约定】
对于 的数据,$n\leq 100$;
对于 的数据,$n\leq 5 \times 10^3$ ;
对于 的数据,$1 \le n\leq 3\times 10^6$,$1\leq a_i\leq 10^9$。
输入输出样例 #1
输入:
CodeBlock Loading...
输出:
CodeBlock Loading...
题意
给定一个长度为 的序列 ,定义 为第 个元素之后第一个严格大于 的元素下标,不存在则为 。输出 。
思路
从右向左维护“严格递减”的单调栈:
- 栈中存储下标,且对应的值严格递减;
- 对于当前位置 ,不断弹出小于等于 的下标,剩余的栈顶即为第一个更大的位置;
- 若栈为空,则 ;
- 处理完后将 入栈继续向左。
时间复杂度 。
代码
CodeBlock Loading...