1 条题解

  • 0
    @ 2025-8-24 22:53:37

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar RDFZchenyy
    悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。

    搬运于2025-08-24 22:53:37,当前版本为作者最后更新于2023-12-25 19:17:47,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目概述

    给定一个长度为 nn 的序列 {xn}\{x_n\},有 QQ 组询问,每组询问给定常数 a,ba,b,请选择最优的 dd,使得 $\sum\limits_{i=1}^{k} a(y-x_i)+ \sum\limits_{i=k+1}^{n} b(x_i-y)$ 最小,并求出最小值,其中 kk 满足 xky<xk+1x_k\le y<x_k+1

    对于 100%100\% 的数据,满足 1n,Q2×1051\le n,Q\le 2\times 10^5

    思路分析

    题解区中已经给出了使用二分/三分的做法,这里给出一种偏数学的做法。

    我们观察一组询问。

    为了方便讨论,我们设 pip_ixix_i 对答案的贡献。即当 xidx_i\le dpi=a(yxi)p_i=a(y-x_i),当 d<xid<x_ipi=b(xiy)p_i=b(x_i-y)

    我们考虑先设 y=1y=1。接着,对于 d0d_0d0+1d_0+1,观察每一个 pip_i 的变化量,我们发现所有的满足 xidx_i\le dpip_i 会增加 aa,所有的满足 xidx_i\le dpip_i 会增加 aa,所有的满足 d<xid<x_ipip_i 会减少 bb

    这说明,如果 ddd0d_0 变化到 d0+1d_0+1,那么答案增加 Δ=k0×a(nk0)×b\Delta= k_0\times a-(n-k_0)\times b。其中 k0k_0d=d0d=d_0 满足 xidx_i\le dii 的数量。随着 dd 的增加,k0k_0 增加,Δ\Delta 也从负数单调递增至非负数。所以,答案随 dd 的增加而先减少后增加。

    为了找到最小的答案,我们只需要找到第一个使 Δ0\Delta\ge0k1k_1,这个 k1k_1 对应的结果即为答案。即我们就是要找到满足 Δ=k×a(nk)×b0\Delta= k\times a-(n-k)\times b\ge0 的最小的 kk 对应的 dd

    对这个式子进行恒等变形:Δ=k×(a+b)n×b\Delta= k\times (a+b)\ge n\times b

    故最小的满足条件的 kkk1=n×ba+bk_1=\lceil \frac{n\times b}{a+b}\rceil,同时我们根据 k1k_1 就可以计算出答案。

    请注意,对于每一组询问,需要将时间复杂度降到 O(1)O(1),故您应当在读入后预处理前缀和

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    #define MAXN 200005
    
    int n,q,u;
    long long x[MAXN],sum[MAXN];
    long long a,b;
    
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>x[i];
    	}	
    	sort(x+1,x+n+1);
       
    	for(int i=1;i<=n;i++){ // 预处理前缀和
    		sum[i]=sum[i-1]+x[i];
    	}
       
    	cin>>q;
    	for(int i=1;i<=q;i++){
    		cin>>a>>b;
    		u=(int)(ceil((long double)b*n/(a+b))); // 为了保证精度如此操作
    		cout<<(x[u]*(u)-sum[u])*a+(sum[n]-sum[u]-x[u]*(n-u))*b<<endl;
    		// 此处计算答案时带入前缀和
    	}
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    9598
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者