zoukankan      html  css  js  c++  java
  • 概率期望,数学,贪心策略——2020-camp-day1-A

    /*
    区间 [l1,r1][l2,r2] 的形成逆序对的概率 
    只考虑相交的情况:三种情况对应的总数tot进行分情况讨论 
    这两个区间里取到逆序对的概率是tot/len1*len2 
    */
    #include<bits/stdc++.h>
    using namespace std;
    #define N 10005
    #define ll long long
    #define mod 998244353
    
    struct Inv{
        ll l,r,base;
    }inv[N];
    int cmp(Inv a,Inv b){return a.l+a.r<b.l+b.r;}
    ll Pow(ll a,ll b){
        ll res=1;
        while(b){
            if(b%2)res=res*a%mod;
            b>>=1;a=a*a%mod;
        }
        return res;
    }
    
    int n;
    
    ll solve(ll i,ll j){
        if(inv[i].r<=inv[j].l)return 0;//逆序对概率为0
        ll R=min(inv[i].r,inv[j].r);
        ll L=max(inv[i].l,inv[j].l);
        ll len=R-L+1,res=0;
        if(inv[i].r>inv[j].r){
            res=len*(len-1)/2%mod;
            res=(res+(inv[i].r-inv[j].r)*(inv[j].r-inv[j].l+1)%mod)%mod;
        } 
        else if(inv[i].r<=inv[j].r && inv[i].l>=inv[j].l){
            res=len*(len-1)/2%mod;
            res=(res+(inv[i].r-inv[i].l+1)*(inv[i].l-inv[j].l)%mod)%mod;
        }
        else if(inv[i].r<=inv[j].r && inv[i].l<inv[j].l){
            res=len*(len-1)/2%mod;
        }
        res=res*inv[i].base%mod*inv[j].base%mod;
        return res;
    }
    
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>inv[i].l>>inv[i].r;
        sort(inv+1,inv+1+n,cmp);
        for(int i=1;i<=n;i++)
            inv[i].base=Pow(inv[i].r-inv[i].l+1,mod-2);
        ll ans=0;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                ans=(ans+solve(i,j))%mod;
        cout<<ans<<'
    ';
    }
    
     
  • 相关阅读:
    Linux下批处理文件
    linux代码端启动终端
    ubuntu截图
    Ubuntu安装多个版本的Opencv
    Ubuntu双系统启动卡死
    Ubuntu14.04运行lsdslam与问题解决
    js懒加载
    公众号开发-获取用户信息
    ClipboardJS 复制文本功能
    css3 Gradient线性渐变详解
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12198699.html
Copyright © 2011-2022 走看看