Loading

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);
}
posted @ 2021-06-15 19:35  yoisaki_hizeci  阅读(64)  评论(0)    收藏  举报