1 条题解

  • 0
    @ 2025-8-24 22:56:55

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar NULL1F1CAT10N
    Recursion / Dispersion / Destruction

    搬运于2025-08-24 22:56:55,当前版本为作者最后更新于2024-04-24 19:46:51,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    Link

    考虑对一组固定的 viv_iRSSRSS 最小值。

    先将 RSSRSS 转换为关于 aa 的形式:

    $RSS=\sum\limits_{i=1}^n(ad_i+b-v_i)^2=(\sum\limits_{i=1}^nd_i^2)a^2+2(\sum\limits_{i=1}^nd_i(b-v_i))a+(\sum\limits_{i=1}^n(b-v_i)^2)$

    由 $n\sum\limits_{i=1}^nd_i^2\neq(\sum\limits_{i=1}^nd_i)^2$ 知 did_i 不全相等,故 i=1ndi2>0\sum\limits_{i=1}^nd_i^2>0,故此处 $a=-\frac{\sum\limits_{i=1}^nd_i(b-v_i)}{\sum\limits_{i=1}^nd_i^2}$ 取最小值。

    将此时的 RSSRSS 转换为关于 bb 的形式:

    此时 $RSS=\frac{1}{\sum\limits_{i=1}^nd_i^2}(\sum\limits_{i=1}^nd_i^2\sum\limits_{i=1}^n(b-v_i)^2-(\sum\limits_{i=1}^nd_i(b-v_i))^2)=\frac{(n\sum\limits_{i=1}^nd_i^2-(\sum\limits_{i=1}^nd_i)^2)b^2-2(\sum\limits_{i=1}^nv_i\sum\limits_{i=1}^nd_i^2-\sum\limits_{i=1}^nd_i\sum\limits_{i=1}^nd_iv_i)b+(\sum\limits_{i=1}^nd_i^2\sum\limits_{i=1}^nv_i^2-(\sum\limits_{i=1}^nd_iv_i)^2)}{\sum\limits_{i=1}^nd_i^2}$ 为一个关于 bb 的二次函数。

    由题 $n\sum\limits_{i=1}^nd_i^2-(\sum\limits_{i=1}^nd_i)^2\neq0$ 且由柯西不等式知 $n\sum\limits_{i=1}^nd_i^2-(\sum\limits_{i=1}^nd_i)^2\ge0$。

    故取 $b=\frac{\sum\limits_{i=1}^nv_i\sum\limits_{i=1}^nd_i^2-\sum\limits_{i=1}^nd_i\sum\limits_{i=1}^nd_iv_i}{n\sum\limits_{i=1}^nd_i^2-(\sum\limits_{i=1}^nd_i)^2}$ 可使 RSSRSS 最小。

    此时 $RSS=-\frac{(\sum\limits_{i=1}^nv_i\sum\limits_{i=1}^nd_i^2-\sum\limits_{i=1}^nd_i\sum\limits_{i=1}^nd_iv_i)^2}{(n\sum\limits_{i=1}^nd_i^2-(\sum\limits_{i=1}^nd_i)^2)\sum\limits_{i=1}^nd_i^2}+\frac{\sum\limits_{i=1}^nd_i^2\sum\limits_{i=1}^nv_i^2-(\sum\limits_{i=1}^nd_iv_i)^2}{\sum\limits_{i=1}^nd_i^2}$。

    此时的 E[RSS]\mathbb{E}[RSS] 即为所求。

    注意到 did_i 固定,也就是说 $-\frac{1}{(n\sum\limits_{i=1}^nd_i^2-(\sum\limits_{i=1}^nd_i)^2)\sum\limits_{i=1}^nd_i^2}$,i=1ndi\sum\limits_{i=1}^nd_ii=1ndi2\sum\limits_{i=1}^nd_i^2 都是固定的。

    即求 $\mathbb{E}[(\sum\limits_{i=1}^nv_i\sum\limits_{i=1}^nd_i^2-\sum\limits_{i=1}^nd_i\sum\limits_{i=1}^nd_iv_i)^2]$ 和 E[i=1nvi2]\mathbb{E}[\sum\limits_{i=1}^nv_i^2] 以及 E[(i=1ndivi)2]\mathbb{E}[(\sum\limits_{i=1}^nd_iv_i)^2]

    $\mathbb{E}[\sum\limits_{i=1}^nv_i^2]=\sum\limits_{i=1}^n\mathbb{E}[v_i^2]=\sum\limits_{i=1}^n(\frac{1}{r_i-l_i+1}\sum\limits_{j=l_i}^{r_i}j^2)=\sum\limits_{i=1}^n\frac{r_i(r_i+1)(2r_i+1)-l_i(l_i-1)(2l_i-1)}{6(r_i-l_i+1)}$。

    $\mathbb{E}[(\sum\limits_{i=1}^nd_iv_i)^2]=\mathbb{E}[\sum\limits_{i=1}^nd_i^2v_i^2]+2\mathbb{E}[\sum\limits_{1\le i<j\le n}d_id_jv_iv_j]=\sum\limits_{i=1}^nd_i^2\mathbb{E}[v_i^2]+2\sum\limits_{1\le i<j\le n}d_i\mathbb{E}[v_i]d_j\mathbb{E}[v_j]=\sum\limits_{i=1}^nd_i^2\mathbb{E}[v_i^2]+(\sum\limits_{i=1}^nd_i\mathbb{E}[v_i])^2-\sum\limits_{i=1}^nd_i^2\mathbb{E}[v_i]^2$, 其中 $\mathbb{E}[v_i]=\frac{r_i(r_i+1)-l_i(l_i-1)}{2(r_i-l_i+1)}$。

    $\mathbb{E}[(\sum\limits_{i=1}^nv_i\sum\limits_{i=1}^nd_i^2-\sum\limits_{i=1}^nd_i\sum\limits_{i=1}^nd_iv_i)^2]=(\sum\limits_{i=1}^nd_i^2)^2\mathbb{E}[(\sum\limits_{i=1}^nv_i)^2]+(\sum\limits_{i=1}^nd_i)^2\mathbb{E}[(\sum\limits_{i=1}^nd_iv_i)^2]-2\sum\limits_{i=1}^nd_i^2\sum\limits_{i=1}^nd_i\mathbb{E}[\sum\limits_{i=1}^nv_i\sum\limits_{i=1}^nd_iv_i]$,其中 E[(i=1ndivi)2]\mathbb{E}[(\sum\limits_{i=1}^nd_iv_i)^2] 已计算过,只需考虑 $\mathbb{E}[\sum\limits_{i=1}^nv_i\sum\limits_{i=1}^nd_iv_i]$ 和 E[(i=1nvi)2]\mathbb{E}[(\sum\limits_{i=1}^nv_i)^2]

    类似 E[(i=1ndivi)2]\mathbb{E}[(\sum\limits_{i=1}^nd_iv_i)^2],可以得出 $\mathbb{E}[(\sum\limits_{i=1}^nv_i)^2]=\sum\limits_{i=1}^n\mathbb{E}[v_i^2]+(\sum\limits_{i=1}^n\mathbb{E}[v_i])^2-\sum\limits_{i=1}^n\mathbb{E}[v_i]^2$,$\mathbb{E}[\sum\limits_{i=1}^nv_i\sum\limits_{i=1}^nd_iv_i]=\sum\limits_{i=1}^nd_i\mathbb{E}[v_i^2]+\sum\limits_{i=1}^n\mathbb{E}[v_i]\sum\limits_{i=1}^nd_i\mathbb{E}[v_i]-\sum\limits_{i=1}^nd_i\mathbb{E}[v_i]^2$。

    最后计算出各式代入原式即可。代码有些凌乱,变量名命名可参考注释。

    #include <bits/stdc++.h>
    using namespace std;
    const int mod = 998244353;
    int ksm(int a, int b, int p = mod) {
    	int ret = 1;
    	while(b) {
    		if(b & 1) {
    			ret = 1ll * ret * a % p;
    		}
    		a = 1ll * a * a % p;
    		b >>= 1;
    	}
    	return ret;
    }
    int inv(int a, int p = mod) {
    	return ksm(a, p - 2, p);
    }
    int n, d[500005], l[500005], r[500005], inv2, inv6;
    int Evv[500005], Evd[500005], Etop, Sdd, Sevv, Sevd2, Sd, ESv2, ESvd2, ESvSvd, Ev[500005], SEv, SEv2, Sevdd, Sevd, Svvd, S;
    /*
    Evv_i = E[v_i^2]
    Evd_i = E[v_id_i]=d_iE[v_i]
    Ev_i = E[v_i]
    下记 \sum\limits_{i=1}^n 为 Sum
    Etop = E[(Sum(v)Sum(d^2)-Sum(d)Sum(vd))^2]
    Sdd = Sum(d^2)
    Sevv = Sum(E[v^2]) = E[Sum(v^2)]
    Sevd2 = Sum(E[(vd)^2])
    Sd = Sum(d)
    ESv2 = E[Sum(v)^2]
    ESvd2 = E[Sum(vd)^2]
    ESvSvd = E[Sum(v)Sum(vd)]
    SEv = Sum(E[v])
    SEv2 = Sum(E[v]^2)
    Sevdd = Sum(E[vd]^2)
    Sevd = Sum(E[vd])
    Svvd = Sum(dE[v^2])
    S = Sum(E[vd]E[v])
    */
    signed main() {
    	cin >> n;
    	inv2 = inv(2);
    	inv6 = inv(6);
    	for(int i = 1; i <= n; ++i) {
    		cin >> d[i] >> l[i] >> r[i];
    		Sdd += 1ll * d[i] * d[i] % mod;
    		Sdd %= mod;
    		Sd += d[i];
    		Sd %= mod;
    		Ev[i] = 1ll * (l[i] + r[i]) % mod * inv2 % mod;
    		SEv += Ev[i];
    		SEv2 += 1ll * Ev[i] * Ev[i] % mod;
    		SEv %= mod;
    		SEv2 %= mod;
    		Evd[i] = 1ll * d[i] * (l[i] + r[i]) % mod * inv2 % mod;
    		Evv[i] = 1ll * ((1ll * r[i] * (r[i] + 1) % mod * (2 * r[i] + 1) % mod - 1ll * l[i] * (l[i] - 1) % mod * (2 * l[i] - 1) % mod) + mod) * inv(r[i] - l[i] + 1) % mod * inv6 % mod;
    		Sevv += Evv[i];
    		Sevd += Evd[i];
    		S += 1ll * Evd[i] * Ev[i] % mod;
    		Sevd2 += 1ll * Evv[i] * d[i] % mod * d[i] % mod;
    		Sevdd += 1ll * Evd[i] * Evd[i] % mod;
    		Svvd += 1ll * Evv[i] * d[i] % mod;
    		Sevv %= mod;
    		Sevd %= mod;
    		Sevd2 %= mod;
    		Sevdd %= mod;
    		Svvd %= mod;
    		S %= mod;
    	}
    	ESv2 = ((Sevv + 1ll * SEv * SEv - SEv2) % mod + mod) % mod;
    	ESvd2 = ((Sevd2 + 1ll * Sevd * Sevd - Sevdd) % mod + mod) % mod;
    	ESvSvd = ((Svvd + 1ll * Sevd * SEv - S) % mod + mod) % mod;
    	Etop = (1ll * ESv2 * Sdd % mod * Sdd % mod + 1ll * Sd * Sd % mod * ESvd2 % mod - 2ll * Sdd * Sd % mod * ESvSvd % mod) % mod;
    	Etop = (Etop + mod) % mod;
    	cout << 1ll * (1ll * Sdd * Sevv - ESvd2 - 1ll * Etop * inv((1ll * n * Sdd - 1ll * Sd * Sd) % mod) % mod + mod) % mod * inv(Sdd) % mod << endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    9774
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者