Atcoder abc282
https://atcoder.jp/contests/abc282/tasks
G - Similar Permutation
两个长n排列A,B
相似度为 相邻同增次数 + 相邻同减次数, (A[i+1]-A[i])(B[i+1]-B[i]) > 0
问 相似度为k的有序对 (A,B) 有多少个, mod p
范围
n 100
p [1e8~1e9]
4s
1024mb
我的思路
看这 n, 感觉有可能就要到4次方, 想一维度的排列,每次 从N-1到n, 就是考虑n的插入位置
但是两个序列的话
a0 a1 a2…..
b0 a1 b2…..
插入一个值, 会让后面的值平移, 增减关系会错位
变一变, f(k) = 至少k个位置增减关系一致, 那么ans = f(k) - f(k+1)
但这样也不知道怎么统计
因为
1 2 3, 假设定了第一个位置是增
那么
1-2 3
2-3 1
1-3 2
第二个位置并不是增 减 数量相等的
如果a和b在从n-1变到n时, 插入位置相同, 那么这个位置的左右增减都是相等的, 但是插入前可能相等可能不等,增量是1, 但不同怎么处理
再就是不要插入n, 而是末尾插入一个
f(len a, last a, len b, last b), 似乎可以搞?, 注意到两个len是相等的
插入 x, 等于 原来 [1…x-1] 不变, [x..n-1] 平移1变成[x+1,n]
f(len, last a, last b,同增减k)
f[n][a1][b1][k1] += f[n-1][a0][b0][k0]
, k1 = k0+ bool( (a1 <= a0)^(b1 <= b0) )
这样状态是 O(n^4) 转移是 O(n^2) 一共O(n^6) 过不了
可能需要二维前缀和搞一搞?, 实际就是一条纵线 a1 = a0 和 b1 = b0 划分的