zoukankan      html  css  js  c++  java
  • cf258D

    题意

      有一个长度为 n 的排列 p,会进行恰好 m 次操作,第 i 次操作会交换第 ai 个数和第 bi 个数字,且交换的概率是0.5,问最后逆序对数目的期望

    题解

      用f[i][j]表示当前p[i]>p[j]的概率,考虑每次交换会对f[i][j]造成的影响,实际上就是f[a[i]][x]=f[b[i]][x]=(f[a[i]][x]+f[b[i]][x])*0.5。最后把所有i<j的f[i][j]相加统计答案即可。

    #include <bits/stdc++.h>
    #define ll long long
    #define inf 0x6fffffff
    #define N 2018
    using namespace std;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    double f[N][N];
    int a[N];
    int main()
    {
        int n=read(),m=read();
        for(int i=1;i<=n;i++)a[i]=read();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)f[i][j]=(a[i]>a[j]);
        for(int i=1;i<=m;i++)
        {
            int x=read(),y=read();
            for(int j=1;j<=n;j++)
                if(j!=x&&j!=y)
                {
                    f[j][x]=f[j][y]=(f[j][x]+f[j][y])/2;
                    f[x][j]=f[y][j]=(f[x][j]+f[y][j])/2;
                }
            f[x][y]=f[y][x]=(f[x][y]+f[y][x])/2;
        }
        double ans=0;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)ans+=f[i][j];
        printf("%.8lf",ans);
        return 0;
    }
  • 相关阅读:
    ASP.NET教程4
    ASP.NET教程11
    TreeView Demo
    System.Net.Dns.GetHostByAddress(string) 已经过时
    会员注册实例
    ASP.NET教程2
    多表关联与表值函数
    ASP.NET教程6
    BusinessFrameWork
    ASP.NET教程8
  • 原文地址:https://www.cnblogs.com/oldjang/p/9585425.html
Copyright © 2011-2022 走看看