线段树爆零求助
查看原帖
线段树爆零求助
357128
Great_juruo楼主2022/2/6 21:15
#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N=200001; 
int n,cnt,ans,sum[N*4];
struct node{
	int data,pos;
} a[N];
bool cmp(node x,node y){
	if(x.data!=y.data){
		return x.data>y.data;
	}else{
		return x.pos>y.pos;
	}
}
int query(int p,int l,int r,int ll,int rr){
	if(l>r) return 0;
	if(l<=ll&&rr<=r){
		return sum[p];
	}
	int mid=(ll+rr)/2;
	int res=0;
	if(l<=mid){
		res+=query(p*2,l,r,ll,mid);
	}
	if(mid<r){
		res+=query(p*2+1,l,r,mid+1,r);
	}
	return res;
}
void update(int p,int loc,int num,int l,int r){
	if(l==r){
		sum[p]+=num;
		return ;
	}
	int mid=(l+r)/2;
	if(loc<=mid){
		update(p*2,loc,num,l,mid);
	}else{
		update(p*2+1,loc,num,mid+1,r);
	}
	sum[p]=sum[p*2]+sum[p*2+1];
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i].data);
		a[i].pos=i;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(i!=1&&a[i].data==a[i-1].data){
			cnt++;
		}  else cnt=0;
		ans+=query(1,1,a[i].pos-1,1,n);
		ans-=cnt;
		update(1,a[i].pos,1,1,n);
	}
	cout<<ans;
	return 0;
} 
2022/2/6 21:15
加载中...