首页 > 其他分享 >P10511 方差 题解

P10511 方差 题解

时间:2024-08-01 12:39:45浏览次数:14  
标签:right 方差 P10511 题解 sum times int mod left

【题目简述】

定义一个长度为 \(n\) 的序列 \(a\) 的方差为:\(s^2=\frac{1}{n} \sum_{i=1}^n (a_i-\overline{a})^2\)。

\(\sum\) 为累加求和符号,\(\overline{a}\) 为序列 \(a\) 的平均数。

给定 \(m\) 个形如 \([l,r,b]\) 的组合,表示 \(a_l,a_{l+1},\ldots,a_r\) 为 \(b\)。

给定 \(q\) 个询问,每个询问形如 \([l,r]\),你要求出区间 \([l,r]\) 的方差 \(s^2 \times (r-l+1)^2\) 的值。

对 \(998244353\) 取模。

【思路】

一道很好的推式子题。。。

前置知识,区间长度乘区间平均值,等于区间和,即:\(n \times \overline{a}=\sum_{i=1}^{n}a_i\),我们暂时称之为:“拆平均”。

再设 \(n=r-l+1\),然后给我死命推!

$\ \ \ \ \ s^2 \times n^2 $

\(= \left[\frac{1}{n} \sum_{i=1}^n (a_i-\overline{a})^2\right]\times n^2 (根据定义展开 s^2)\)

\(= \left[\sum_{i=1}^n (a_i-\overline{a})^2\right]\times n (把一个 n 乘进去)\)

\(= \left[\sum_{i=1}^n (a_i^2-2a_i\overline{a}+\overline{a}^2)\right]\times n (完全平方公式展开)\)

\(= \left(\sum_{i=1}^n a_i^2 - \sum_{i=1}^n 2a_i\overline{a} +\sum_{i=1}^n \overline{a}^2\right)\times n (分裂)\)

\(= n \times \left(\sum_{i=1}^n a_i^2 \right) - n \times 2 \overline{a}\sum_{i=1}^n a_i + n \times \sum_{i=1}^n \overline{a}^2 (拆括号)\)

\(= n \times \left(\sum_{i=1}^n a_i^2 \right) - 2 \left(\sum_{i=1}^n a_i \right)^2 + n \times \sum_{i=1}^n \overline{a}^2 (拆中项平均)\)

\(= n \times \left(\sum_{i=1}^n a_i^2 \right) - 2 \left(\sum_{i=1}^n a_i \right)^2 + \frac{1}{n} \times n^2 \sum_{i=1}^n \overline{a}^2 (拆 n)\)

\(= n \times \left(\sum_{i=1}^n a_i^2 \right) - 2 \left(\sum_{i=1}^n a_i \right)^2 + \frac{1}{n} \times \sum_{i=1}^n n^2 \overline{a}^2 (把 n^2 乘进去)\)

\(= n \times \left(\sum_{i=1}^n a_i^2 \right) - 2 \left(\sum_{i=1}^n a_i \right)^2 + \frac{1}{n} \times \sum_{i=1}^n (n \times \overline{a})^2 (提平方)\)

\(= n \times \left(\sum_{i=1}^n a_i^2 \right) - 2 \left(\sum_{i=1}^n a_i \right)^2 + \frac{1}{n} \sum_{i=1}^n (\sum_{j=1}^{n}a_j)^2 (拆平均)\)

\(= n \times \left(\sum_{i=1}^n a_i^2 \right) - 2 \left(\sum_{i=1}^n a_i \right)^2 + \frac{1}{n} \times n (\sum_{j=1}^{n}a_j)^2 (由于末项括号内值与 i 无关,直接化简)\)

\(= n \times \left(\sum_{i=1}^n a_i^2 \right) - 2 \left(\sum_{i=1}^n a_i \right)^2 + (\sum_{i=1}^{n}a_i)^2 (常数互相抵消)\)

\(= n \times \left(\sum_{i=1}^n a_i^2 \right) - \left(\sum_{i=1}^n a_i \right)^2 (二、三项合并)\)

至此,我们已经消除了所有的 \(\overline{a}\),把式子转化为了一个比较好看的形式。

发现式子中的两个求和符号可以用前缀和维护,恭喜你这道题就做完RE了。

发现数据范围 \(1\le l_i\le r_i\le n\le \color{red}10^{18}\),原地趋势。

于是借鉴分块的思想(?),把每一段的和&平方和维护出来,对于两侧不满足一整段的部分,直接暴力求解。

具体现代码。

【Code】

#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int mod=998244353;

int n,m,q,l[200005],r[200005],b[200005];
int sum1[200005],sum2[200005];           //区间和&区间平方和
int x,y;

int Baoli1(int l,int r,int b){
	return (((r-l+1)%mod)*b)%mod;
}

int Baoli2(int l,int r,int b){
	return (((r-l+1)%mod)*((b*b)%mod))%mod;
}

int Calc(int x,int y){
	int len=(y-x+1)%mod;
	int flagx=lower_bound(r+1,r+1+m,x)-r; //最左端在哪一段
	int flagy=lower_bound(r+1,r+1+m,y)-r; //最右端在哪一段
	if(flagx==flagy){
		return 0; //如果再同一段,说明区间全部相等,直接输出 0
	}else{
		int s1=(Baoli1(x,r[flagx],b[flagx])+Baoli1(l[flagy],y,b[flagy]))%mod; //暴力求解两端的和
		int s2=(Baoli2(x,r[flagx],b[flagx])+Baoli2(l[flagy],y,b[flagy]))%mod; //暴力求解两端的平方和
		flagx++,flagy--;
		s1=(s1+(sum1[flagy]-sum1[flagx-1]+mod))%mod;   //加上中间段的和
		s2=(s2+(sum2[flagy]-sum2[flagx-1]+mod))%mod;   //加上中间段的平方和
		return (((len*s2)%mod+mod)-((s1*s1)%mod))%mod; //公式最后一步
	}
}

signed main()
{
	scanf("%lld%lld%lld",&n,&m,&q);
	for(int i=1;i<=m;i++){
		scanf("%lld%lld%lld",&l[i],&r[i],&b[i]);b[i]%=mod;
		int len=(r[i]-l[i]+1)%mod;
		sum1[i]=(sum1[i-1]+((len*b[i])%mod))%mod;              //长度*数值
		sum2[i]=(sum2[i-1]+((len*((b[i]*b[i])%mod))%mod))%mod; //长度*数值的平方
	}
	for(int i=1;i<=q;i++){
		scanf("%lld%lld",&x,&y);
		printf("%lld\n",Calc(x,y));
	}
	return 0;
}

标签:right,方差,P10511,题解,sum,times,int,mod,left
From: https://www.cnblogs.com/Sundar-2022/p/18336422

相关文章

  • 洛谷P2696之慈善的约瑟夫——题解
    洛谷P2696题解[传送锚点](P2696慈善的约瑟夫-洛谷|计算机科学教育新生态(luogu.com.cn))比不过大佬,从蒟蒻做起选择比较水有意思的解法——用队列模拟(还是窝太弱了)正片开始考虑队列模拟,因为每次都是假的剔除,所以我们的目标是找到每回游戏的最终存活者。将不被剔除,......
  • 题解:Pinely Round 4 (Div. 1 + Div. 2) C
    C.AbsoluteZerotimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouaregivenanarray\(a\)of\(n\)integers.Inoneoperation,youwillperformthefollowingtwo-stepmove:Choose......
  • Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]
    思路不难想,细节比较多。思路观察到\(n\le19\),首先想到状压dp。于是自然地定义\(dp[j][i]\)为:抵达点的状态为\(i\),且此时在点\(j\)时,简单路径的条数。注意这里是简单路径的条数,而不是环的个数,因为环的个数要在dp过程中统计。这里的dp作用就在于求简单路径条数。......
  • [JOI 2020 Final] 火事 题解
    给一篇题解。(下面这张图是从luogu上粘贴的,因为不太会画图)其中纵坐标为\(t\),横坐标为\(a_i\)。发现同颜色块只有平行四边形和直角梯形(等腰直角三角形)两种情况。可以将直角梯形削去左下角,分成两部分考虑。等直可以直接暴力插入区间,总个数\(O(n)\)。平行四边形可以看作上......
  • [CF455D] Serega and Fun 题解
    不知道大家做没做过数列分块基础9题?插入删除操作可以用链表,线段树等数据结构都不好维护,考虑分块。对于修改操作,暴力重构受影响块的链表,发现除首尾块外,其他块都可以看作是区间左移一位,所以加头删尾即可。每个块开一个数组(绝对不能是\((un\_)map\),不然你会和我一样死的很诡异),表示......
  • HDU2024 R2 T9 题解
    考虑维护一下每个点的速度。把区间加拆成后缀加和后缀减,然后考虑后缀加。减就同理。考虑在一段后缀的目标速度增加之后,哪些时刻的加速度会变化。这里加速度必然只会变大\(1\),因此在这个时刻之后的速度都会增加\(1\),又由于目标速度也增加了\(1\),所以这个位置之后的加速度都不再......
  • CF455D Serega and Fun 题解
    Beforeit来当一回教练的题解翻译家,平衡树这种高级算法自然是不会的,所以详细讲一下STL。成为蒟蒻(也就是自己)的福音。Solution我们观察到题目要求“把第\(r\)个数插入在第\(l\)个数之前,其他数顺序不变“,使用\(deque\)的\(push\)_\(front\)和\(push\)_$back$操作可......
  • 暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法
    暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法暗区突围也可以在电脑上游玩拉,暗区突围PC端上线在即,本次上线就是全球抢先测试了,很多小伙伴在游戏下载过程中遇到了很多问题,比如:下载失......
  • QOJ6504 Flower‘s Land 2 题解
    QOJ6504Flower'sLand2题解题目链接:QOJ6504Flower'sLand2题意:给定一个只包含\(0,1,2\)的序列,\(T\)次询问,询问有两种:区间所有数加\(1\)然后模\(3\)求一段区间能否通过每次删掉相邻两个相同的数删完(如\(1,0,0,2,2,1\)就满足条件)题解:考虑用什么方法来维护区间......
  • CF1995C Squaring 题解
    思路详解:请注意,本题解用到了非整数计算,也就是说性能可能不如整数运算,但是易于实现,追求最优解的大佬不建议观看本题解。这个题看似简单,但是由于涉及到了平方操作,不用高精度根本存不下,然后如果你要用高精度的话又会T......