传送门

分析

我们发现这个四元组可以分解成一个逆序对拼上一个顺序对,这个线段树搞搞然后乘一下就可以求出来了,但是我们发现可能有(a,b)为逆序对且(b,c)为顺序对的情况,所以要进行容斥,我们只需要枚举是哪一个点重合然后减掉即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
long long a[],b[],d[],sum,d1[];
long long S1[],S2[],S11[],S21[];
map<long long,long long>id;
inline void add(long long le,long long ri,long long wh,long long pl,long long k){
d[wh]+=k;
if(le==ri)return;
long long mid=(le+ri)>>;
if(mid>=pl)add(le,mid,wh<<,pl,k);
else add(mid+,ri,wh<<|,pl,k);
return;
}
inline void add2(long long le,long long ri,long long wh,long long pl,long long k){
d1[wh]+=k;
if(le==ri)return;
long long mid=(le+ri)>>;
if(mid>=pl)add2(le,mid,wh<<,pl,k);
else add2(mid+,ri,wh<<|,pl,k);
return;
}
inline long long q(long long le,long long ri,long long x,long long y,long long wh){
if(x>y)return ;
if(le>=x&&ri<=y)return d[wh];
long long mid=(le+ri)>>,ans=;
if(mid>=x)ans+=q(le,mid,x,y,wh<<);
if(mid<y)ans+=q(mid+,ri,x,y,wh<<|);
return ans;
}
inline long long q2(long long le,long long ri,long long x,long long y,long long wh){
if(x>y)return ;
if(le>=x&&ri<=y)return d1[wh];
long long mid=(le+ri)>>,ans=;
if(mid>=x)ans+=q2(le,mid,x,y,wh<<);
if(mid<y)ans+=q2(mid+,ri,x,y,wh<<|);
return ans;
}
int main(){
long long n,m,i,j,k,sum1=,sum2=;
scanf("%lld",&n);
id.clear();
for(i=;i<=n;i++)scanf("%lld",&a[i]),b[i]=a[i];
sort(b+,b+n+);
for(i=;i<=n;i++)
if(!id[b[i]])
id[b[i]]=++sum;
for(i=;i<=n;i++){
long long x=q(,sum,,id[a[i]]-,),y=q(,sum,id[a[i]]+,sum,);
sum1+=x;sum2+=y;
add(,sum,,id[a[i]],);
}
long long Ans=(long long)sum1*sum2;
memset(d,,sizeof(d));
memset(d1,,sizeof(d1));
for(i=;i<=n;i++){
S1[i]=q(,sum,,id[a[i]]-,);
S11[i]=q(,sum,id[a[i]]+,sum,);
add(,sum,,id[a[i]],);
}
for(i=n;i>;i--){
S2[i]=q2(,sum,,id[a[i]]-,);
S21[i]=q2(,sum,id[a[i]]+,sum,);
add2(,sum,,id[a[i]],);
}
for(i=;i<=n;i++)
Ans-=(long long)S1[i]*S2[i]+(long long)S11[i]*S1[i]+(long long)S21[i]*S2[i]+(long long)S21[i]*S11[i];
printf("%lld\n",Ans);
return ;
}

最新文章

  1. ixgbe rx_missed_errors
  2. Linux 下从头再走 GTK+-3.0 (二)
  3. Disciz!NT开源资源汇总
  4. 安装和配置Tomcat
  5. LCLFramework框架之开发约束
  6. C程序(3)
  7. RadioButton 自定义控件
  8. JavaScript事件基础知识总结【思维导图】
  9. 获取某几个分类下的前N条数据 mssql语句
  10. JavaScript Infinite scroll &amp; Masonry
  11. Deep Learning for Natural Language Processing1
  12. jsp:setProperty
  13. Springs Element &#39;beans&#39; cannot have character [children], because the type&#39;s content type is element-only
  14. 面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享
  15. SQLSERVER实现更改表名,更改列名,更改约束代码
  16. 载入DLL中的图片资源生成Skia中的SkBitmap对象
  17. Android框架之Volley与Glide
  18. Java面试宝典(2018版)
  19. GoldenGate BR(bounded Recovery)简单说明
  20. Dropout的理解

热门文章

  1. jdbc connection为什么放在webINF的lib里面
  2. (转)关于Linux核心转储文件 core dump
  3. spring学习-2
  4. Linux 获取随机密码
  5. mvc那些事
  6. h5废弃的标签和属性及新增的标签和属性
  7. Unity 头发随动效果
  8. Eclipse jar包源码下载
  9. hdu 3932 Groundhog Build Home——模拟退火
  10. (1)java8初体验