6361

6361. 【NOIP2019模拟2019.9.18】鲳数(pair)

题目大意

求l到r的逆序对和

题解

首先规定\(num_{up}[i]\)表示从高位到低位(n~i)组成的数,\(num_{low}[i]\)从低位到高位 (1~i)组成的数,a[i]表示第i位的数值

1~n是低位到高位

举个栗子:12345中\(num_{up}[3]=345,num_{low}[4]=1234\)

考虑一种类似数位dp的东西

设f[i,j]表示\(0\to10^i-1\)中小于j的位数和(\(j∈[1,9]\))

g[i,j]表示\(0\to num_{low}[i]\)中小于j的位数和(\(j∈[1,9]\))

然后就用数位dp的老套路,对于i,累加1~i-1的贡献,再加i位的贡献

转移方程:

\(f[i,j]=10\times f[i-1][j]+10^{i-1}j\)

\(g[i,j]=f[i-1][j]*a[i]+g[i-1][j]+(j<=a[i]?10^{i-1}j:num_low[i]+1)\)

预处理完后,就可以使用按位累加ans了

第i位的贡献为\(g[i-1][a[i]]+\sum_{j=1}^9num_{up}[i+1]f[i-1][j]+\sum_{j=1}^{a[i]-1}f[i-1][j]\)

然后就没了,记得取模

posted @ 2024-02-22 20:50  zhy_learn  阅读(8)  评论(0编辑  收藏  举报