题意:长度为n的排列,m次交换xi, yi,每个交换x,y有50%的概率不发生,问逆序数的期望 。n, m <= 1000
思路:我们只用维护大小关系,dp[i][j]表示位置i的数比位置j的数大的概率。
那么每次交换x和y。 假设x<y,那么区间就有三种: [1,x-1],[x+1,y-1], [y+1,N], 不难证明这三个区间和xy处的逆序对关系变为二者和的一半。
#include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=1010; double dp[maxn][maxn],ans; int a[maxn]; int main() { int N,M,x,y; scanf("%d%d",&N,&M); rep(i,1,N) scanf("%d",&a[i]); rep(i,1,N) rep(j,1,N) dp[i][j]=a[i]>a[j]; rep(i,1,M){ scanf("%d%d",&x,&y); rep(j,1,N){ if(j==x||j==y) continue; dp[j][x]=dp[j][y]=(dp[j][x]+dp[j][y])/2; dp[x][j]=dp[y][j]=(dp[x][j]+dp[y][j])/2; } dp[x][y]=dp[y][x]=0.5; } rep(i,1,N) rep(j,i+1,N) ans+=dp[i][j]; printf("%.6lf\n",ans); return 0; }