逆序对分三类:

1.已知对已知

树状数组直接处理即可

2.未知对未知

设未知数的位置数为\(m\),则有\(m(m-1)/2\)个数对。一个数对是逆序对的期望是\(0.5\)(一个逆序对与一个非逆序对对应)。因为期望的可加性,总期望为\(m(m-1)/4\)

3.已知对未知

处理出对于每个数\(i\),比它大且可填入原序列的数的个数\(a_i\)和比它小且可填入原序列的数的个数\(b_i\)

如果未知数在已知数\(i\)的左边,期望为\(a_i/m\),否则为\(b_i/m\),全加起来就行了

代码:

#include <bits/stdc++.h>
#define mod 998244353ll
#define ll long long
#define rep(i,x,y) for(i=x;i<=y;++i)
#define des(i,x,y) for(i=x;i>=y;--i)
#define rd(x) scanf("%d",&x)
#define N 200005
using namespace std;

int a[N],bg[N],sm[N],n;
ll c[N],t[N];
bool vis[N];

inline ll ksm(ll x,ll y){
    ll z=1;
    while(y){
        if(y&1) (z*=x)%=mod;
        (x*=x)%=mod,y>>=1;
    }
    return z;
}
inline int lowbit(int x){ return x&(-x);}
inline void add(ll *a,int x,int y){
    for(int i=x;i<=n;i+=lowbit(i)) (a[i]+=y)%=mod;
}
inline ll query(ll *a,int x){
    ll tmp=0;
    for(int i=x;i>0;i-=lowbit(i))
        (tmp+=a[i])%=mod;
    return tmp;
}

int main(){
    int i,tot=0;
    ll ans=0,inv;
    rd(n);
    rep(i,1,n){
        rd(a[i]);
        if(a[i]==-1) tot++;
        else vis[a[i]]=1;
    }
    inv=ksm(1ll*tot,mod-2);
    (ans+=1ll*tot*(tot-1)%mod*ksm(4ll,mod-2)%mod)%=mod;
    bg[n]=0,sm[1]=0;
    des(i,n-1,1) bg[i]=bg[i+1]+(!vis[i+1]);
    rep(i,2,n) sm[i]=sm[i-1]+(!vis[i-1]);
    rep(i,1,n){
        if(~a[i]) add(c,a[i],sm[a[i]]*inv%mod);
        else (ans+=query(c,n))%=mod;
    }
    memset(c,0,sizeof(c));
    des(i,n,1){
        if(~a[i]){
            (ans+=query(t,a[i]))%=mod;
            add(t,a[i],1),add(c,a[i],bg[a[i]]*inv%mod);
        } else (ans+=query(c,n))%=mod;
    }
    printf("%I64d",ans);
}

CF1096F Inversion Expectation的更多相关文章

  1. CF1096.F. Inversion Expectation(树状数组)

    A permutation of size n is an array of size n such that each integer from 1 to n occurs exactly once ...

  2. Codeforces Educational Codeforces Round 57 题解

    传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...

  3. Educational Codeforces Round 57题解

    A.Find Divisible 沙比题 显然l和2*l可以直接满足条件. 代码 #include<iostream> #include<cctype> #include< ...

  4. Codeforces Educational Round 57

    这场出题人好像特别喜欢998244353,每个题里都放一个 A.Find Divisible 考察选手对输入输出的掌握 输出l 2*l即可(为啥你要放这个题,凑字数吗 #include<cstd ...

  5. Educational Codeforces Round 57 Solution

    A. Find Divisible 签到. #include <bits/stdc++.h> using namespace std; int t, l, r; int main() { ...

  6. Educational Codeforces Round 57 (Rated for Div. 2) ABCDEF题解

    题目总链接:https://codeforces.com/contest/1096 A. Find Divisible 题意: 给出l,r,在[l,r]里面找两个数x,y,使得y%x==0,保证有解. ...

  7. 数据结构作业——expectation(树形dp+dfs)

    expectation Description 给出一棵带权值的树,我们假设从某个节点出发,到目标节点的时间为两个节点之间的最短路.由于出发节点不好选取,所以选在每个节点都有一定的概率,现在我们要求从 ...

  8. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  9. 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)

    控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...

随机推荐

  1. jvisualvm远程监控 visualgc插件 不受此jvm支持问题

    https://yq.aliyun.com/ziliao/478212 1.修改远程服务器上java设置 vi $JAVA_HOME/jre/lib/security/java.policy    在 ...

  2. MySQL查询优化注意下面的四个细节

    原文:http://bbs.landingbj.com/t-0-244231-1.html 在任何一个数据库中,查询优化都是不可避免的一个话题.对于数据库工程师来说,优化工作是最有挑战性的工作.MyS ...

  3. HTML4到HTML5

    第一步: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0.1//EN" "http://www.w3.org/TR/html ...

  4. JS对象、基本类型和字面量的区别

    字面值: var str1='this is a simple string'; var num1=1.45; var answer1=true; 基本类型: var str2=String('thi ...

  5. Struts2——通配符,Action Method_DMI

    Action wildcard 通配符(配置量降到最低) 使用通配符,就是为了配置简便,但是一定遵守“约定优于配置”原则,约定就是做项目之前最好事先与项目组的人或是自己规定好命名规则. 多个*  {1 ...

  6. python3 自动识图

    一.安装依赖库 pip install pytesseract pip install pillow 二.安装识图引擎tesseract-ocr https://pan.baidu.com/s/1Qa ...

  7. WPF当属性值改变时利用PropertyChanged事件来加载动画

    在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通 ...

  8. Linux中,去掉终端显示的当前目录的绝对路径

    Linux中,去掉终端显示的当前目录的绝对路径 去~/.bashrc中,找到PS1变量的定义,如果没有,手动加上: 可以将显示输出到标题栏上: #export PS1="[e]2;u@H w ...

  9. 获取DataSet中某行某列的数据

    LabelText = DataSet11.Tables("COMM.USERS").Rows[0]["User_Name"].tostring() Label ...

  10. Java之指定Junit测试方法的执行顺序举例

    问题描述: 大家都知道使用JUnit进行测试的时候,方法的执行顺序不是按照编写的先后顺序执行的,那么如何控制Junit的执行顺序呢? 解决方法: 在测试类上加 @FixMethodOrder 注解即可 ...