题意: 解法: 显然每次k的变化就是将a数组的第一个元素移到最后, 考虑每次移动,逆序对的变化量, 设当前a[1]=x, 那么答案就应该减去数组中<x的数的个数, 还需要加上数组中>x的数的个数. 用树状数组进行查询就行了. code: #include<bits/stdc++.h> typedef long long ll; #define int long long using namespace std; const int maxm=2e6+5; struct Node{ int c[maxm]; int lowbit(int i){ return i&-i; } void add(int i,int t){ while(i<maxm)c[i]+=t,i+=lowbit(i); } int ask(int i){ int ans=0; while(i)ans+=c[i],i-=lowbit(i); return ans; } }T; int a[maxm]; int n; void solve(){ cin>>n; int ans=0; for(int i=1;i<=n;i++){ cin>>a[i]; a[i]++; ans+=i-1-T.ask(a[i]); T.add(a[i],1); } for(int i=1;i<=n;i++){ cout<<ans<<endl; ans-=T.ask(a[i]-1);//减去比他小的 ans+=n-T.ask(a[i]);//加上比他大的 } } signed main(){ ios::sync_with_stdio(0); int T=1; while(T--){ solve(); } return 0; }