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 in this array. An inversion in a permutation p is a pair of indices (i,j) such that i>j and ai<aj. For example, a permutation [4,1,3,2] contains 4 inversions: (2,1), (3,1), (4,1), (4,3)
.
You are given a permutation p
of size n. However, the numbers on some positions are replaced by −1. Let the valid permutation be such a replacement of −1 in this sequence back to numbers from 1 to n in such a way that the resulting sequence is a permutation of size n
.
The given sequence was turned into a valid permutation randomly with the equal probability of getting each valid permutation.
Calculate the expected total number of inversions in the resulting valid permutation.
It can be shown that it is in the form of PQ
where P and Q are non-negative integers and Q≠0. Report the value of P⋅Q−1(mod998244353)
.
Input
The first line contains a single integer n
(1≤n≤2⋅105
) — the length of the sequence.
The second line contains n
integers p1,p2,…,pn (−1≤pi≤n, pi≠0
) — the initial sequence.
It is guaranteed that all elements not equal to −1
are pairwise distinct.
Output
Print a single integer — the expected total number of inversions in the resulting valid permutation.
It can be shown that it is in the form of PQ
where P and Q are non-negative integers and Q≠0. Report the value of P⋅Q−1(mod998244353)
.
Examples
3
3 -1 -1
499122179
2
1 2
0
2
-1 -1
499122177
题意:给定一个数组,是一个N的排列,其中有些未知没有填数,让你补全,问逆序对的期望是多少。
思路:就是枚举几种情况就好了。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const int maxn=;
const int Mod=;
int vis[maxn],a[maxn],b[maxn],cnt,sum[maxn],fac[maxn],ans,v,tot,N;
int qpow(int a,int x){
int res=; while(x){
if(x&) res=1LL*res*a%Mod;
a=1LL*a*a%Mod; x>>=;
} return res;
}
void add(int x){ for(;x<=N;x+=(-x)&x) sum[x]++;}
int query(int x){ int res=; for(;x;x-=(-x)&x) res+=sum[x]; return res; }
int main()
{
scanf("%d",&N);
rep(i,,N) {
scanf("%d",&a[i]);
if(a[i]!=-) vis[a[i]]=;
}
rep(i,,N) if(!vis[i]) b[++cnt]=i; //空位
sort(b+,b+cnt+);fac[]=; rep(i,,cnt) fac[i]=1LL*fac[i-]*i%Mod;
rep(i,,N){
if(a[i]!=-){
int Less=query(a[i]);
ans=(ans+1LL*(tot-Less)*fac[cnt]%Mod)%Mod; //已知+已知
int pos=lower_bound(b+,b+cnt+,a[i])-b; pos--;
ans=(ans+1LL*pos*(cnt-v)%Mod*fac[cnt-]%Mod)%Mod; //已知+未知
ans=(ans+1LL*(cnt-pos)*v%Mod*fac[cnt-]%Mod)%Mod;//未知+已知
tot++; add(a[i]);
}
else v++;
}
ans=(ans+1LL*cnt*(cnt-)%Mod*fac[cnt]%Mod*qpow(,Mod-)%Mod)%Mod; //未知+未知
fac[cnt]=qpow(fac[cnt],Mod-);
printf("%d\n",1LL*ans*fac[cnt]%Mod);
return ;
}
CF1096.F. Inversion Expectation(树状数组)的更多相关文章
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
- [hdu1394]Minimum Inversion Number(树状数组)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) F dfs序+树状数组
Performance ReviewEmployee performance reviews are a necessary evil in any company. In a performance ...
- 牛客网暑期ACM多校训练营(第五场) F - take —— 期望+树状数组+逆元
看到一篇好的博客特意转出来观摩大佬:转:https://blog.csdn.net/greybtfly/article/details/81413526 题目大意:给n个箱子排成一排,从头到尾按顺序依 ...
- HDU 1394 Minimum Inversion Number (树状数组求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多 ...
- HDU 1394 Minimum Inversion Number (树状数组 && 规律 && 逆序数)
题意 : 有一个n个数的数列且元素都是0~n-1,问你将数列的其中某一个数及其前面的数全部置到后面这种操作中(比如3 2 1 0中选择第二个数倒置就产生1 0 3 2)能产生的最少的逆序数对是多少? ...
- 2019牛客多校第七场 F Energy stones 树状数组+算贡献转化模拟
Energy stones 题意 有n块石头,每块有初始能量E[i],每秒石头会增长能量L[i],石头的能量上限是C[i],现有m次时刻,每次会把[s[i],t[i]]的石头的能量吸干,问最后得到了多 ...
- hdu 1394 Minimum Inversion Number - 树状数组
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...
- F - Moving Points树状数组
题:https://codeforces.com/contest/1311/problem/F 题意:给定x轴上的点以及他们的速度v,只在x轴上运动,求最小的dis之和,注意,这里的时间是可随意的,比 ...
随机推荐
- c++ primer plus 第六章 课后题答案
#include <iostream> #include <cctype> using namespace std; int main() { char in_put; do ...
- English trip -- VC(情景课)10 C I like to watch TV. 我爱看电视
Grammar focus 语法点: like to do you do they What does he like to do? does she Practice 练习 ...
- GetImageURL
Sub GetImageUrl(ByVal URL As String) Dim strText As String Dim i As Long Dim OneImg With CreateObjec ...
- 20170716xlVba销售明细转销售单据
Sub CreateSaleList() AppSettings On Error GoTo ErrHandler Dim StartTime As Variant '开始时间 Dim UsedTim ...
- python-day41--数据库---数据类型
一.存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 二.mysql 数据类型 1.数字:(宽度指的是显示宽度,与存储无关) 不用指定宽度, ...
- python-day33--进程间通信(IPC)
方式:队列(推荐使用) 一.基本情况 1.可以往队列里放任意类型的数据 2. 队列:先进先出 3. q=Queue(3) #可以设置队列中最多可以进入多少个值,也可以不设置 q.put('first' ...
- 将 HttpPostedFile 转换成 Image 或者 Bitmap
代码如下: HttpFileCollection httpfiles = context.Request.Files; files = httpfiles[i]; Image im = Image.F ...
- CSS——标准盒子模型
在写网页的时候一般都先用Div把网页的框架搭好(用不同的背景颜色来区分不同的Div块),然后填充每一个Div,最后把每个Div的背景颜色去掉 <html> <head> < ...
- SpringBoot 之Spring Boot Starter依赖包及作用
Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...
- java中4种修饰符访问权限的区别
访问权限 类 本包 子类 其他包 public √ √ √ √ protected √ √ √ x default(缺省) √ √ x x private √ x x x