【Wannafly Daily 4.22】World is Exploding

来源:互联网 发布:大数据改变教育 编辑:程序博客网 时间:2024/05/17 09:08

https://cn.vjudge.net/contest/158362#problem/M

好老的题,计算一下总的上升与下降个数乘起来减去不合法的即可

#include<stdio.h>#include<algorithm>using namespace std;#define For(i,a,b) for (int i=a;i<=b;i++)typedef long long ll;#define N 50005#define se second#define fi firstpair<int,int> p[N];int n,k,a[N],t[N],pre_lo[N],pre_hi[N],suf_lo[N],suf_hi[N];inline void add(int x){for (;x<=n;x+=x&-x) t[x]++;}inline int find(int x){    int rt=0;    for (;x;x-=x&-x) rt+=t[x];    return rt;}int main(){    p[0].fi=-1;    while (~scanf("%d",&n))    {        For(i,1,n) scanf("%d",&k),p[i]=make_pair(k,i);        sort(p+1,p+n+1);        For(i,1,n) a[p[i].se]=a[p[i-1].se]+(p[i].fi!=p[i-1].fi);        For(i,1,n) t[i]=0;        For(i,1,n) add(a[i]),pre_lo[i]=find(a[i]-1),pre_hi[i]=i-find(a[i]);        For(i,1,n) t[i]=0;        for (int i=n;i;i--) suf_lo[i]=find(a[i]-1),suf_hi[i]=n-i-find(a[i]),add(a[i]);        ll sum_hi=0,sum_lo=0;        For(i,1,n) sum_hi+=pre_hi[i],sum_lo+=pre_lo[i];        ll ans=sum_hi*sum_lo;        for (int i=1;i<=n;i++)        {            ans-=(ll)pre_lo[i]*suf_lo[i];            ans-=(ll)pre_hi[i]*suf_hi[i];            ans-=(ll)pre_lo[i]*pre_hi[i];            ans-=(ll)suf_lo[i]*suf_hi[i];        }        printf("%I64d\n",ans);    }}
0 0