可以发现最后的最长上升子序列是由原序列中从某一个点开始的最长上升子序列A和最长下降子序列B组合而成的,贡献的方案数为numA *numB。注意找到更长的以后要把原来的方案数清零。
假设最终最长长度为R,最后答案要乘上2^(N-R),因为其他元素可以任意选择放左边或右边。
求最长上升/下降子序列及方案数可以用树状数组做。经典的dp方程:F[i]=max{F[j]+1}(a[i]
type
node=record
t,s:int64;
end;
var
n,i,j:longint;
last,size,lq,ans1,ans2:int64;
a,b:array[0..500100]of int64;
c,l:array[0..500100]of node;
f1,g1,f2,g2:array[0..500100]of int64;
o:node;
const md=1000000007;
function max(x,y:int64):int64;
begin
if x>y then exit(y)
else exit(x);
end;
procedure qs(p,q:longint);
va