警示后人

P1908 逆序对

Mible2012 @ 2024-12-28 17:31:51

#include <iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int MAXN = 5e5 + 5;
vector<int> arr;
vector<int> arr2;
int bit[MAXN];
unordered_map<int,int> map;

void update(int idx, int val, int n) {
    while (idx <= n) {
        bit[idx] += val;
        idx += idx & -idx;
    }
}

int query(int idx) {
    int sum = 0;
    while (idx > 0) {
        sum += bit[idx];
        idx -= idx & -idx;
    }
    return sum;
}
void lisanhua(){
    arr2=arr;
    sort(arr2.begin(), arr2.end());
    arr2.erase(unique(arr2.begin(),arr2.end()),arr2.end());
    for (int i = 0; i < arr.size(); ++i) {
        map[arr[i]] = lower_bound(arr2.begin(),arr2.end(), arr[i]) - arr2.begin() + 1;
    }
}

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
    }

    lisanhua();
    long long ans=0;
    for (int i = n-1; i >= 0; --i) {
        int now= map[arr[i]];
        ans+=query(now-1);
        update(now,1,n);
    }
    cout<<ans;

    return 0;
}

非常没有问题的代码,结果: 全RE,运行一下,输入都不行。 经过一堆排查,我发现了问题的所在:

vector<int> arr(MAXN);
vector<int> arr2(MAXN);

这玩意必须得加(MAXN),不然会炸。


|