蒟蒻求调教

P1908 逆序对

_AyachiNene @ 2023-03-08 20:44:57

#include<bits/stdc++.h>
using namespace std;
struct node
{
    long long l,r,val;
}a[1145140*4+1];
struct shit
{
    int id,va;
}da[1145141];
int n,ans,k,id[1145141];
bool cmp(shit x,shit y)
{
    return x.va==y.va?x.id<y.id:x.va<y.va;
}
void bld(int l,int r,int root)
{
    a[root].l=l;
    a[root].r=r;
    if(l==r)
        return;
    int mid=(l+r)/2;
    bld(l,mid,root*2);
    bld(mid+1,r,root*2+1);
}
void add(int x,int root)
{
    if(a[root].l==a[root].r)
    {
        a[root].val++;
        return;
    }
    int mid=(a[root].l+a[root].r/2);
    if(x<=mid)
        add(x,root*2);
    else
        add(x,root*2+1);
    a[root].val=a[root*2].val+a[root*2+1].val;
}
int query(int x,int y,int root)
{
    int mid=(a[root].l+a[root].r)/2;
    int ret=0;
    if (x<=a[root].l&&a[root].r<=y)
        return a[root].val;
    if (x<=mid)
        ret+=query(x,y,root*2);
    if (y>mid)
        ret+=query(x,y,root*2+1);
    return ret;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>da[i].va,da[i].id=i;
    sort(1+da,1+da+n,cmp);
    for(int i=1;i<=n;i++)
        id[da[i].id]=i;
//  for(int i=1;i<=n;i++)
//      cout<<id[i];
    bld(1,n,1);
    for(int i=1;i<=n;i++)
    {
        int x=id[i];
        ans+=query(x+1,n,1);
        add(x,1);
    }
    cout<<ans;
}

by 2c_s @ 2023-03-11 09:50:56

楼主代码太臭力(悲


|