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

Input
3
3 -1 -1
Output
499122179
Input
2
1 2
Output
0
Input
2
-1 -1
Output
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(树状数组)的更多相关文章

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

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

  2. [hdu1394]Minimum Inversion Number(树状数组)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  3. 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 ...

  4. 牛客网暑期ACM多校训练营(第五场) F - take —— 期望+树状数组+逆元

    看到一篇好的博客特意转出来观摩大佬:转:https://blog.csdn.net/greybtfly/article/details/81413526 题目大意:给n个箱子排成一排,从头到尾按顺序依 ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多 ...

  6. HDU 1394 Minimum Inversion Number (树状数组 && 规律 && 逆序数)

    题意 : 有一个n个数的数列且元素都是0~n-1,问你将数列的其中某一个数及其前面的数全部置到后面这种操作中(比如3 2 1 0中选择第二个数倒置就产生1 0 3 2)能产生的最少的逆序数对是多少? ...

  7. 2019牛客多校第七场 F Energy stones 树状数组+算贡献转化模拟

    Energy stones 题意 有n块石头,每块有初始能量E[i],每秒石头会增长能量L[i],石头的能量上限是C[i],现有m次时刻,每次会把[s[i],t[i]]的石头的能量吸干,问最后得到了多 ...

  8. hdu 1394 Minimum Inversion Number - 树状数组

    The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...

  9. F - Moving Points树状数组

    题:https://codeforces.com/contest/1311/problem/F 题意:给定x轴上的点以及他们的速度v,只在x轴上运动,求最小的dis之和,注意,这里的时间是可随意的,比 ...

随机推荐

  1. 【Golang】字符串首字母大小写转化

    写在前面 在自动化过程中,我们用得最多的可能就是字符串的处理,熟悉Python的都知道在Python中要让一个字符串的首字母大写直接用capitalize就可以了,但是同样的事情在Golang中没有这 ...

  2. RabbitMQ入门_08_所谓的点对点与发布订阅模型

    A. JMS 模型 JMS 中定义了点对点和发布订阅两种消息模型,原来以为 AMQP 协议中 direct Exchange 对应点对点模型,topic Exchange 对应发布订阅模型,fanou ...

  3. Java读取xml

    首先将xml的格式展示出来,如下 <?xml version="1.0"?> <configuration> <connectionStrings n ...

  4. 20170624xlVBA生成通讯录文件

    Public Sub QqYunContactTransferCsvFile() '应用程序设置 Application.ScreenUpdating = False Application.Disp ...

  5. 12月16日 增加一个购物车内product数量的功能, 自定义method,在helper中定义,计算代码Refactor到Model中。

    仿照Rails实战:购物网站 教材:5-6 step5:计算总价,做出在nav上显示购物车内product的数量. 遇到的❌: 1. <% sum = 0 %> <% current ...

  6. 使用python创建mxnet操作符(网络层)

    对cuda了解不多,所以使用python创建新的操作层是个不错的选择,当然这个性能不如cuda编写的代码. 在MXNET源码的example/numpy-ops/下有官方提供的使用python编写新操 ...

  7. HDU2159二维背包

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. iOS UI-界面传值(三种方法)

    #import <Foundation/Foundation.h> @interface DataModel : NSObject @property (nonatomic, copy) ...

  9. MySQL使用全文索引(fulltext index)---高性能

    转载地址:https://blog.csdn.net/u011734144/article/details/52817766/ 1.创建全文索引(FullText index) 旧版的MySQL的全文 ...

  10. 微信小程序wx.chooseImage和wx.previewImage的综合使用(图片上传可以限制个数)

    本例从微信小程序的组件扒下来的. WXML: <view class="weui-cell"> <view class="weui-cell__bd&q ...