题面
内容
有 只青蛙排成一排青蛙序列在开会,其中第 只青蛙的叫声大小是 。
对于任意两只青蛙 ,如果 ,则 。
现在要从青蛙中选出一支青蛙集训队,集训队的成员编号为 ,,,。
集训队要求:
-
对于第 名集训队成员和第 名集训队成员,假设 ,那一定需要满足第 名集训队成员在青蛙序列中的位置比第 名集训队在青蛙序列中的位置更靠前。
-
对于第 名集训队成员和第 名集训队成员,假设 ,那一定需要满足第 名集训队成员的叫声比第 名集训队的叫声更小。
你需要求出有多少种选出青蛙集训队的方案。
答案对 取模。
输入
第一行输入两个数 。
接下来输入 行,每行一个数,其中第 行输入 ,表示第 只青蛙的叫声。
输出
输出一个数,答案对 取模后的结果。
样例
输入
5 2
1
2
3
5
4
输出
7
提示
样例解释
我们用青蛙序列的下标位置来表示每一名青蛙集训队成员,用集合来表示青蛙集训队,则合法的青蛙集训队有:
{1,2,3},{1,2,4},{1,2,5},{1,3,4},{1,3,5},{2,3,4},{2,3,5}。
数据范围
对于 的数据,,。
对于 的数据,,。
对于 的数据,, , 。
思路
求长度为的最长上升子序列的方案数。
代表以为结尾的最长上升子序列,
的值可以由的状态转移过来。
那么我们可以令表示以结尾长度为的最长上升子序列的方案数。
那么如果一个的位置长度为可以被更新,那么它的上一个位置长度为可以更新它,也就是累加上的答案。
因此要更新需要满足的条件是,更新给 的值就是所有满足这个条件的的和。
即图中所有的的值都需要累加。
那么我们可以开一个二元组来维护这个关系,
这样其实就是在找左边的所有的的和。
怎么保证?
是从前往后插入的。
用树状数组优化区间求和问题。
由于,因此需要开个树状数组来维护这个问题。
每次更新第层时,需要访问第层树状数组。
表示最后一个选择的区间的右端点,
表示最多能选的区间,优先选短的区间,
对i而言,找到一个最大的j使得区间和为0,即右端点和左端点左边的前缀和相同
记录一个last为上次和i前置和相同的点的位置,
i一定从j-1转移过来么?
不一定,因为上一段不一定以j-1结尾
那就把j之前的区间的f值取个max来更新
那么q次询问就需要通过数据结构来优化复杂度
以每个i结尾的区间最多只有一个有意义,即最小的,
那么总共就有n个区间有意义,将它预处理出来,然后建树
以i结尾的区间for一遍就可以通过last维护最小的这个区间
选完一个区间后就可以选右端点最小的区间
所以说选完以后选下一个区间是一个固定的过程
预处理
这样出来以后就是一棵树
第一个的是左端点大于l右端点最小的区间
然后一直走直到超出r
倍增求解就可以了。