2 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=2e5+10; int n,a[N],c[N+1],L[N]; //L[i]表示对于a[i]左边有多少个比它小 int lowbit(int x){return x&(-x);} void add(int x,int k){for(;x<=n;x+=lowbit(x))c[x]+=k;} int getsum(int x){int res=0;for(;x>=1;x-=lowbit(x))res+=c[x];return res;} int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); memset(c,0,sizeof(c)); for(int i=1;i<=n;i++)add(a[i],1),L[i]=getsum(a[i]-1); LL ans=0; for(int i=2;i<n;i++) { ans+=LL(i-1-L[i])*(n-a[i]-(i-1-L[i])); } printf("%lld ",ans); ans=0; for(int i=2;i<n;i++) { ans+=LL(L[i])*(a[i]-1-L[i]); } printf("%lld\n",ans); return 0; } -
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=2e5+10; int n,a[N],c[N+1],L[N]; //L[i]表示对于a[i]左边有多少个比它小 int lowbit(int x){return x&(-x);} void add(int x,int k){for(;x<=n;x+=lowbit(x))c[x]+=k;} int getsum(int x){int res=0;for(;x>=1;x-=lowbit(x))res+=c[x];return res;} int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); memset(c,0,sizeof(c)); for(int i=1;i<=n;i++)add(a[i],1),L[i]=getsum(a[i]-1); LL ans=0; for(int i=2;i<n;i++) { ans+=LL(i-1-L[i])*(n-a[i]-(i-1-L[i])); } printf("%lld ",ans); ans=0; for(int i=2;i<n;i++) { ans+=LL(L[i])*(a[i]-1-L[i]); } printf("%lld\n",ans); return 0; }
- 1
信息
- ID
- 1324
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 6
- 标签
- 递交数
- 109
- 已通过
- 35
- 上传者