Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
136079 吴悠 学生排队 C++ 通过 100 23 MS 9724 KB 794 2024-03-07 20:57:03

Tests(10/10):


#include<iostream> #include<cstring> using namespace std; int n; long long 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; }


测评信息: