1 条题解

  • 0
    @ 2025-7-8 14:06:50
    #include<bits/stdc++.h>
    using namespace std;
    struct Bitree{
    	long long bi[1000010],ibi[1000010];
    	long long n;
    	long long lowbit(long long x){
    		return (x & -x);
    	}
    	void init(long long size){
    		n = size;
    		for(long long i = 0; i <= n; i++){
    			bi[i] = 0;
    			ibi[i]=0;
    		}
    	}
    	void add(long long pos,long long val){
    		long long vb=val;
    		long long vib=val*pos;
    		while(pos <= n){
    			bi[pos] += vb;
    			ibi[pos] += vib;
    			pos += lowbit(pos);
    		}
    	}
    	long long queryb(long long pos){
    		long long ans = 0;
    		while(pos > 0){
    			ans += bi[pos];
    			pos -= lowbit(pos);
    		}
    		return ans;
    	}
    	long long queryib(long long pos){
    		long long ans = 0;
    		while(pos > 0){
    			ans += ibi[pos];
    			pos -= lowbit(pos);
    		}
    		return ans;
    	}
    	long long query(long long pos){
    		return queryb(pos) *(pos+1) -queryib(pos);
    	}
    	long long query(long long l,long long r){
    		return query(r)-query(l-1);
    	}
    };
    struct thing{
    	long long a;
    	long long i;
    };
    bool cmp(thing x,thing y){
    	if(x.a==y.a){
    		return x.i<y.i;
    	}
    	return x.a<y.a;
    }
    Bitree bitree;
    thing a[500005];
    
    int main(){ 
    	ios::sync_with_stdio(0);
    	cin.tie();
    	cout.tie();
    	long long n;
    	cin>>n;
    	bitree.init(n);
    	for(long long i=1;i<=n;i++){
    		cin>>a[i].a;
    		a[i].i=i;
    	}
    	sort(a+1,a+n+1,cmp);
    	long long ans=0;
    	for(long long i=1;i<=n;++i){
    		bitree.add(a[i].i,1);
    		ans+=i-bitree.queryb(a[i].i);
    	}
    	cout<<ans;
    	return 0; 
    }
    
    
    • 1

    信息

    ID
    2399
    时间
    30ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    24
    已通过
    10
    上传者