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]\)
然后就没了,记得取模