50pts MLE, 求调
  • 板块P1908 逆序对
  • 楼主vvrr
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/2/8 12:39
  • 上次更新2025/2/8 15:11:44
查看原帖
50pts MLE, 求调
783060
vvrr楼主2025/2/8 12:39

rt 代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=500050;
int a[maxn],top;
struct node
{
    int l,r,mid;
    int lson,rson;
    ll num;
}s[64*maxn];
void update(int x)
{
    s[x].num=s[s[x].lson].num+s[s[x].rson].num;
}
int ins(int x,int l,int u,int v)
{
    if(x==0)x=++top;
    s[x].l=u;
    s[x].r=v;
    s[x].mid=(u+v)>>1;
    if(s[x].l==s[x].r)
    {
        s[x].num++;
        return x;
    }
    if(l>s[x].mid)s[x].rson=ins(s[x].rson,l,s[x].mid+1,v);
    else s[x].lson=ins(s[x].lson,l,u,s[x].mid);
    update(x);
    return x;
}
ll qry(int x,int l,int r)
{
    if(x==0)return 0;
    if(s[x].l>=l&&s[x].r<=r)return s[x].num;
    if(l>s[x].mid)return qry(s[x].rson,l,r);
    else if(r<=s[x].mid) return qry(s[x].lson,l,r);
    else return qry(s[x].rson,l,r)+qry(s[x].lson,l,r);
}
int main()
{
    int n,m,i,j,k,l,root=0;
    ll sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        root=ins(root,a[i],1,1000000000);
        sum+=(ll)i-qry(1,1,a[i]);
    }
    printf("%lld\n",sum);
}

权值线段树,没有离散化

2025/2/8 12:39
加载中...