归并排序求逆序对为什么会爆TLE,求大佬指点
查看原帖
归并排序求逆序对为什么会爆TLE,求大佬指点
1004193
Xing_Kong_C楼主2024/11/6 02:18

就会写归并排序求逆序对结果还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;
}
/*   /\_/\
*   (= ._.)
*   / >  \>
*/
2024/11/6 02:18
加载中...