1 条题解

  • 0
    @ 2025-3-18 11:08:38

    首先我们看到答案是求 max(ai,aj)×d\max(a_i,a_j) \times d

    所以说我们可以想到按照 aia_i 的大小排序

    然后在排序的时候我们开两个树状数组,我们可以求出来对于任意一个 aia_i 前面有多少个比它小的数,与比他小的数的位置的前缀和

    然后在统计答案的时候,我们可以同时求出来 aia_i 前面比它大的和比它小的,并且算出来答案

            n=reads();
    		for(int i=1;i<=n;i++){
    			a[i].w=reads(),a[i].x=reads();
    			maxn=max(maxn,a[i].x);
    		}
    		sort(a+1,a+n+1,cmp);
    //		for(int i=1;i<=n;i++){
    //			cout<<a[i].w<<" "<<a[i].x<<endl;
    //		}
    		for(int i=1;i<=n;i++){
    			int low=asks(a[i].x,0),up=sum[i-1]-low,lownum=asks(a[i].x,1),upnum=i-1-lownum;
    //			cout<<i<<" "<<low<<" "<<lownum<<" "<<up<<" "<<upnum<<" "<<a[i].x<<" "<<a[i].w<<" ";
    			ans+=(1ll*abs(low-lownum*a[i].x)+up-upnum*a[i].x)*a[i].w;
    			add(a[i].x,a[i].x,0),add(a[i].x,1,1);
    			sum[i]=sum[i-1]+a[i].x;
    //			cout<<ans<<endl;
    		}
    		printf("%lld\n",ans);
    
    • 1

    信息

    ID
    83
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    (无)
    递交数
    73
    已通过
    23
    上传者