Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
136078 | 吴悠 | 学生排队 | C++ | 解答错误 | 60 | 20 MS | 4964 KB | 788 | 2024-03-07 20:56:33 |
#include<iostream> #include<cstring> using namespace std; int n; int a[100001],f[1000001],sum[100001]; //a:原数组 f:树状数组 sum:统计每人调换次数 int lowbit(int n){ //求二进制下n的最后一个1的位权 return n&-n; } void modi(int id){ //添加一个节点 while(id<=1e6){ f[id]++; id+=lowbit(id); } return ; } int get(int id){ int ans=0; while(id>0){ ans+=f[id]; id-=lowbit(id); } return ans; } int main(){ cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); a[i]++; modi(a[i]); sum[i]=i-get(a[i]); } memset(f,0,sizeof(f)); for(int i=n;i>0;i--){ modi(a[i]); sum[i]+=get(a[i]-1); } long long ans=0; for(int i=1;i<=n;i++){ ans+=(1+sum[i])*sum[i]/2; } cout<<ans<<endl; return 0; }