AGC030D题解
令\(dp[T][i][j]\)表示在\(T\)次运算之后\(a_i\ge a_j\)的概率。我们可以从初始数组信息获得\(dp[0][i][j]\)的值。
然后考虑每次运算之后的转移,虽然这看上去每次是\(O(N^2)\)的,但由于每次只会更改两个位置,所以可以在\(O(N)\)时间复杂度内完成转移。
由于期望的线性性,因此最后数组期望逆序对个数为\(\sum dp[Q][i][j](i<j)\)再乘上\(2^Q\)
时间复杂度\(O(N^2+NQ)\)
int a[3333];
double dp[3333][3333];
int n,q;
signed main()
{
n=read(),q=read();
R(i,1,n) a[i]=read();
R(i,1,n) R(j,1,n) dp[i][j]=a[i]>a[j];
int x,y;
R(k,1,q)
{
x=read(),y=read();
if(x>y) swap(x,y);
R(i,1,n) if(i^x&&i^y)
{
dp[x][i]=dp[y][i]=(dp[x][i]+dp[y][i])/2.0;
dp[i][x]=dp[i][y]=(dp[i][x]+dp[i][y])/2.0;
}
dp[x][x]=dp[y][y]=0;
dp[x][y]=dp[y][x]=(dp[x][y]+dp[y][x])/2.0;
}
double ans=0;
R(i,1,n) R(j,i+1,n) ans=(ans+dp[i][j]);
printf("%.18lf\n",ans);
}

浙公网安备 33010602011771号