权值线段树TLE25

P1908 逆序对

d909RCA @ 2024-01-26 11:37:51

我不会写成O(n^2)了吧

#include <bits/stdc++.h>
using namespace std;
int n,id[1000009],cnt,ans;
pair<int,int> f[1000009];
struct node
{
    int l,r,d;
}a[4000009];
void build(int d,int l,int r)
{
    a[d].l=l;
    a[d].r=r;
    if(l==r) return ;
    int mid=(l+r)>>1;
    build(d<<1,l,mid);
    build(d<<1|1,mid+1,r);
}
void add(int d,int x)
{
    if(a[d].l==a[d].r) 
    {
        if(a[d].l==x) a[d].d=(a[d].d|1);
        return ;
    }
    add(d<<1,x);
    add(d<<1|1,x);
    a[d].d=a[d<<1].d+a[d<<1|1].d;
}
int ask(int d,int l,int r)
{
    int res=0;
    if(a[d].l>r||a[d].r<l) return 0;
    if(a[d].r<=r&&a[d].l>=l) return a[d].d;
    res+=ask(d<<1,l,r);
    res+=ask(d<<1|1,l,r);
    return res;
}
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>f[i].first;
        f[i].second=i;
    }
    sort(f+1,f+n+1);
    for(int i=1;i<=n;i++)
    {
        if(f[i].first!=f[i-1].first) cnt++;
        id[f[i].second]=cnt;
    }
    build(1,1,n);
    for(int i=1;i<=n;i++)
    {
        add(1,id[i]);
        ans+=ask(1,id[i]+1,cnt);
    }
    cout<<ans<<endl;
    return 0;
}

by D23lhc @ 2024-01-26 11:45:22

1


by _fairytale_ @ 2024-01-26 12:18:52

对,add函数的锅。


by d909RCA @ 2024-01-28 17:08:10

@fairytale 已AC %%%


|