一道最基础的求逆序对的题目
一开始我用的是结构体指针的做法,50分,后面十个点MLE
在第十一个样例中,下载数据后,我发现我的线段树开了6052166个节点(代码中的cnt)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e9+5;
int n,a;
long long ans=0;
struct edge{
edge *l,*r;
int sum;
edge(){
sum=0,l=NULL,r=NULL;
}
void upd_sum(){
sum=0;
sum+=(l==NULL?0:l->sum);
sum+=(r==NULL?0:r->sum);
return ;
}
};
edge *rt=NULL;int cnt=0;
struct node{
void update(edge *&now,int l,int r,int pos){
if(!now)now=new edge(),cnt++;
if(l>r)return;
if(l==r){
if(l==pos)
now->sum++;
return ;
}
int mid=(l+r)/2;
if(pos<=mid)update(now->l,l,mid,pos);
else update(now->r,mid+1,r,pos);
now->upd_sum();
return ;
}
int check(edge *&now,int l,int r,int x,int y){
if(!now)return 0;
if(l>r)return 0;
if(r<x||y<l)return 0;
if(x<=l&&r<=y)return now->sum;
int mid=(l+r)/2;
return check(now->l,l,mid,x,y)+check(now->r,mid+1,r,x,y);
}
}T;
signed main(){
// freopen("P1908_11.in","r",stdin);
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a);
ans+=T.check(rt,1,1e9,a+1,1e9);
printf("%d %d\n",i,cnt);
// cout<<ans<<endl;
T.update(rt,1,1e9,a);
}
cout<<ans<<endl;
return 0;
}
之后我改成了用数组代替指针的写法,然后AC了
这一次却过了,想问一下是什么原因导致的数组空间溢出。