AtCoder Grand Contest 023 E - Inversions
Description
给出长度为 \(n\) 序列 \(A_i\),求出所有长度为 \(n\) 的排列 \(P\),满足 \(P_i<=A_i\),求所有满足条件的 \(P\) 的逆序对数之和
题面
Solution
设 \(c[k]\) 表示 \(A_i>=k\) 的个数,那么对于所有的 \(c[k]>=(n-k+1)\),不满足则不合法
把 \(c[k]\) 变为 \(c[k]-(n-k),\)总方案就是 \(\Pi c[k]\)
考虑逆序对 \((i,j)\) 的贡献
如果满足 \(A_i<=A_j\) ,那么把 \(A_j\) 变成 \(A_i\),然后 \((i,j)\) 作为逆序对的方案数就是合法排列的方案数除以 \(2\)
把 \(A_j\) 变成 \(A_i\) 之后,\([A_i+1,A_j]\) 这一个区间的 \(c\) 会减 \(1\),可以维护一个前缀积 \(\frac{c_i-1}{c_i}\) 可以 \(O(1)\) 算出替换后的贡献
那么就可以树状数组维护一下每个数对的贡献了
对于 \(A[i]>A[j]\) 的情况,补集转换一下,总方案-把 \(A_i\) 替换成 \(A_j\) 的方案,然后和上面一样的做一遍就好了
#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=2e5+10,mod=1e9+7;
inline int qm(int x,int k){
int sum=1;
while(k){
if(k&1)sum=1ll*sum*x%mod;
x=1ll*x*x%mod;k>>=1;
}
return sum;
}
int n,a[N],c[N],v0[N],R[N],tr[N],S;
inline void add(int x,int t){
for(int i=x;i<=n;i+=(i&(-i)))tr[i]=(tr[i]+t)%mod;
}
inline int qry(int x){
int ret=0;
for(int i=x;i>=1;i-=(i&(-i)))ret=(ret+tr[i])%mod;
return ret;
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)gi(a[i]),c[a[i]]++;
for(int i=n-1;i>=1;i--)c[i]+=c[i+1]-1;
for(int i=1;i<=n;i++)if(c[i]<=0)return puts("0"),0;
v0[0]=S=1;
for(int i=1;i<=n;i++){
v0[i]=1ll*v0[i-1]*(c[i]>1?c[i]-1:1)%mod*qm(c[i],mod-2)%mod;
S=1ll*S*c[i]%mod;
}
R[n]=n;
for(int i=n-1;i>=1;i--)R[i]=c[i+1]>1?R[i+1]:i;
int ans=0,t;
//A[i]<=A[j]
for(int i=n;i>=1;i--){
t=(qry(R[a[i]])-qry(a[i]-1)+mod)%mod;
ans=(ans+1ll*t*qm(v0[a[i]],mod-2))%mod;
add(a[i],v0[a[i]]);
}
//A[i]>A[j]
R[1]=1;
memset(tr,0,sizeof(tr));
for(int i=2;i<=n;i++)R[i]=c[i]>1?R[i-1]:i;
for(int i=n;i>=1;i--){
t=(qry(a[i]-1)-qry(R[a[i]]-1)+mod)%mod;
ans=(ans-1ll*t*v0[a[i]]%mod+mod)%mod;
add(a[i],qm(v0[a[i]],mod-2));
}
ans=1ll*ans*qm(2,mod-2)%mod;
memset(tr,0,sizeof(tr));
for(int i=1;i<=n;i++){
ans=(1ll*ans+i-1-qry(a[i])+mod)%mod;
add(a[i],1);
}
ans=1ll*ans*S%mod;
cout<<ans<<endl;
return 0;
}
AtCoder Grand Contest 023 E - Inversions的更多相关文章
- Atcoder Grand Contest 023 E - Inversions(线段树+扫描线)
洛谷题面传送门 & Atcoder 题面传送门 毒瘤 jxd 作业-- 首先我们不能直接对所有排列计算贡献对吧,这样复杂度肯定吃不消,因此我们考虑对每两个位置 \(x,y(x<y)\), ...
- AtCoder Grand Contest 023 A - Zero-Sum Ranges
Time limit : 2sec / Memory limit : 256MB Score : 200 points Problem Statement We have an integer seq ...
- AtCoder Grand Contest 023 C - Painting Machines
Description 一个长度为 \(n\) 的序列,初始都为 \(0\),你需要求出一个长度为 \(n-1\) 的排列 \(P\), 按照 \(1\) 到 \(n\) 的顺序,每次把 \(P_i\ ...
- AtCoder Grand Contest 023 F - 01 on Tree
Description 题面 Solution HNOI-day2-t2 复制上去,删点东西,即可 \(AC\) #include<bits/stdc++.h> using namespa ...
- Atcoder Grand Contest 023
A 略 B 略 C(计数) 题意: 有n个白球排成一行,故有n-1个空隙,我可以给一个空隙对应的两个白球都涂黑.n-1个空隙的一个排列就对应着一个涂黑顺序,定义这个涂黑顺序的价值是“将所有n个球都涂黑 ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
- AtCoder Grand Contest 010
AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...
随机推荐
- 比较php字符串连接的效率
php字符串连接有三种方式 1)使用 . 链接 2)使用 .= 连接 3)implode 函数连接数组元素 /*以下测试在ci框架进行*/ private function get_mcrotime( ...
- ubuntu14.04,安装Chrome(谷歌浏览器)
Linux:ubuntu14.04 一直都很喜欢谷歌浏览器,进入linux怎么能没有? 安装方法:谷歌浏览器官方下载的ubuntu版本,下载后点击即可安装. 下载地址:http://download. ...
- hive默认分隔符
默认分隔符‘\001',对应ascii码SOH: 通过cat -A filename可以查看分隔符:
- 洛谷P4559 [JSOI2018]列队(主席树)
题面 传送门 题解 首先考虑一个贪心,我们把所有的人按\(a_i\)排个序,那么排序后的第一个人到\(k\),第二个人到\(k+1\),...,第\(i\)个人到\(k+i-1\),易证这样一定是最优 ...
- linux操作之文本编辑器
1.文本编辑器的作用 编辑和修改系统中的那些以文本形式存在的文件(特别是各种配置文件),也可以用于 编写程序代码 2.linux下的常见编辑器 nano.Emacs.gedit.vim等 3.vim三 ...
- .Generator与其他异步处理方案
1.Generator与其他异步处理方案 以前,异步编程的方法,大概有下面四种. 1.1 回调函数 JavaScript 语言对异步编程的实现,就是回调函数.所谓回调函数,就是把任务的第二段单独写在一 ...
- ios网络 -- HTTP请求 and 文件下载/断点下载
一:请求 http://www.jianshu.com/p/8a90aa6bad6b 二:下载 iOS网络--『文件下载.断点下载』的实现(一):NSURLConnection http://www. ...
- Exalogic硬件架构
1.硬件配置见如下图表. 组件名称 满配 半配 1/4配 1/8配 Sun Rack II 1242 1 1 1 1 计算节点 X2-2.X3-2.X4-2.X5-2.X6-2 30 16 8 4 存 ...
- FPGA基础学习(5) -- 时序约束(实践篇)
目录 1. 理论回顾 2. 时间裕量 3. 最大延迟和最小延迟 4. 案例分析 参考文献: 距离上一篇有关时序的理论篇已经有一段时间了(可以参考博文FPGA时序约束--理论篇),实际上此段时间,甚至到 ...
- python学习之路---day26
网络的基本知识点 一:网络通信原理 连接两台计算机之间的Internet之间的协议一系列协议为互联网协议 互联网协议的功能是:定义计算机如何接入Internet,以及Internet的计算机通信标准 ...