就会写归并排序求逆序对结果还T掉了,求大佬指点
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll res = 0, a[500005], b[500005];
ll n,m;
void merge_sort(ll l, ll r){
if(l == r){
return ;
}
ll mid = l + r >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
ll i = l, j = mid + 1, k = l;
while(i <= mid && j <= r){
if(a[i] <= a[j]){
b[k++] = a[i++];
}
else{
b[k++] = a[j++];
res += mid - i + 1;
}
}
while(i <= mid){
b[k++] = a[i++];
}
while(j <= n){
b[k++] = a[j++];
}
for(int i = l; i <= r; i ++){
a[i] = b[i];
}
}
void solve(){
cin >> n >> m;
for(int i = 1; i <= n;i ++) { cin >> a[i]; a[i] += a[i - 1]; a[i] %= m;}
ll sum = 0;
for(int i = 1; i <= n;i ++)sum += a[i] * i;
for(int i = 1; i <= n;i ++)sum -= a[i - 1] * (n - i + 1) ;
merge_sort(1, n);
sum += m * res;
cout << sum << endl;
}
int main()
{
ios :: sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin >> t;
while(t--){
solve();
}
return 0;
}
/* /\_/\
* (= ._.)
* / > \>
*/