CF1096F Inversion Expectation
逆序对分三类:
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的更多相关文章
- 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 ...
- Codeforces Educational Codeforces Round 57 题解
传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...
- Educational Codeforces Round 57题解
A.Find Divisible 沙比题 显然l和2*l可以直接满足条件. 代码 #include<iostream> #include<cctype> #include< ...
- Codeforces Educational Round 57
这场出题人好像特别喜欢998244353,每个题里都放一个 A.Find Divisible 考察选手对输入输出的掌握 输出l 2*l即可(为啥你要放这个题,凑字数吗 #include<cstd ...
- Educational Codeforces Round 57 Solution
A. Find Divisible 签到. #include <bits/stdc++.h> using namespace std; int t, l, r; int main() { ...
- 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,保证有解. ...
- 数据结构作业——expectation(树形dp+dfs)
expectation Description 给出一棵带权值的树,我们假设从某个节点出发,到目标节点的时间为两个节点之间的最短路.由于出发节点不好选取,所以选在每个节点都有一定的概率,现在我们要求从 ...
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
- 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)
控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...
随机推荐
- myeclipse部署报错报空指针异常
hib4.1+spring3+struts2项目 项目运行报错,把WEB-INF/classes目录删除后,想再重新编译并自动部署.再自动部署时总是提示错误: Errors occurred duri ...
- react双组件传值和传参
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java中有关Null的9件事(转)
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...
- .Net在操作mysql查询的时候出现“: Unknown column 'UserName' in 'where clause'”错误
今天使用.Net操作mysql查询的时候,如果加上条件查询的时候就会出现 Unknown column 'UserName' in 'where clause'这个错,不加条件直接select * f ...
- spring boot+mybatis+generator生成domain大小写问题
之前遇到一个问题,用generator生成数据库对应的domain,以前都是好好的,那天突然生成的domain都是小写的,因为我数据库里是大写的,后来找到解决办法, <table tableNa ...
- iperf网络测试
iperf网络测试文档 地址: https://www.jianshu.com/p/942a9d9bc704
- Guava Cache源码详解
目录 一.引子 二.使用方法 2.1 CacheBuilder有3种失效重载模式 2.2 测试验证 三.源码剖析 3.1 简介 3.2 源码剖析 四.总结 优点: 缺点: 正文 回到顶部 一.引子 缓 ...
- Navicat Preminum
此软件在连接的时候,需要这样: 新建链接==>连接属性==>编码选择自动==>如果此时点击确定的话,会把整个服务器的所有数据库都打开, 我们也可以只打开指定的数据库, 点击高级==& ...
- 多IP地址--笔记
多IP 地址特性使虚拟用户可以在一个load generator上运行且被识别为多个IP地址 1 虚拟IP是同一个generator上的多个IP,这种分配过程由controller自动来进行 2 对于 ...
- Promise是什么?
一. Promise是什么? Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来. 避免了多级异步操作的回调函数嵌套. Promise最早 ...