nlogn为何会TLE?

P1908 逆序对

Austra @ 2022-08-25 16:41:36

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=5e5+5;
int n,tot,ans,a[MAXN],b[MAXN],c[MAXN];
map<int,int>h;
int ask(int x){
    int sum=0;
    for(;x;x-=x&-x)sum+=c[x];
    return sum;
}
void add(int x){
    for(;x<=n;x+=x&-x)c[x]++;
}
inline int read(){
    char c=getchar();int x=0,s=1;
    while(c<'0'||c>'9'){if(c=='-')s=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*s;
}
signed main(){
    n=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
        b[i]=a[i];
    }
    sort(b+1,b+n+1);
    for(int i=1;i<=n;i++){
        if(b[i]!=b[i-1])h[b[i]]=++tot;
    }
    for(int i=1;i<=n;i++){
        a[i]=h[a[i]];
        add(a[i]);
        ans+=i-ask(a[i]);
    }
    cout<<ans;
    return 0;
}

by eigw22h619 @ 2022-08-25 16:59:10

注意常数。用unordered_map就行了。

为什么这部分可以不带log非要带呢


by Austra @ 2022-08-25 17:21:24

@eigw22h619 这是离散化啊,没有map也会有二分补上这个log


by eigw22h619 @ 2022-08-25 20:37:50

之前去干一些神秘事情去了...。不懂啊我加了个"unordered_"一交就过了啊


|