【JZOJ4231】寻找神格【分块】

题目大意:

一个长度为 n n n的数列,要求支持 4 4 4个操作:

  1. 0   x   y 0\ x\ y 0 x y,表示将位置 x x x的数字增加 y y y
  2. 1   x   y   z 1\ x\ y\ z 1 x y z,表示 [ x , y ) [x,y) [x,y)中的数字全部加 z z z
  3. 2   x   y 2\ x\ y 2 x y,表示询问 x ∼ y x\sim y xy之间的数字和。
  4. 3   x   y 3\ x\ y 3 x y,表示询问 x ∼ y x\sim y xy之间的数字方差。

思路:

n ≤ 100000 n\leq 100000 n100000,考虑分块。(个人感觉分块比线段树好打)。
对于 2 2 2操作,很明显是需要在每个块内维护块内和。所以用 s u m [ i ] sum[i] sum[i]表示块 i i i中的数字和。
对于 3 3 3操作,考虑将方差用完全平方公式拆开。
1 n [ ( x 1 − a v e ) 2 + ( x 2 − a v e ) 2 + . . . + ( x n − a v e ) 2 ] \frac{1}{n}[(x1-ave)^2+(x2-ave)^2+...+(xn-ave)^2] n1[(x1ave)2+(x2ave)2+...+(xnave)2]
先不考虑 1 n \frac{1}{n} n1
( x 1 − a v e ) 2 + ( x 2 − a v e ) 2 + . . . + ( x n − a v e ) 2 (x1-ave)^2+(x2-ave)^2+...+(xn-ave)^2 (x1ave)2+(x2ave)2+...+(xnave)2
拆开得
( x 1 2 − 2 × x 1 × a v e ) + ( x 2 2 + 2 × x 2 × a v e ) + . . . + ( x n 2 + 2 × x n × a v e ) (x1^2-2\times x1\times ave)+(x2^2+2\times x2\times ave)+...+(xn^2+2\times xn\times ave) (x122×x1×ave)+(x22+2×x2×ave)+...+(xn2+2×xn×ave)
去括号+整理得
x 1 2 + x 2 2 + . . . + x n 2 + 2 a v e × x 1 + 2 a v e × x 2 + . . . 2 a v e × x n + a v e 2 + a v e 2 + . . . + a v e 2 x1^2+x2^2+...+xn^2+2ave\times x1+2ave\times x2+...2ave\times xn+ave^2+ave^2+...+ave^2 x12+x22+...+xn2+2ave×x1+2ave×x2+...2ave×xn+ave2+ave2+...+ave2

整理得
x 1 2 + x 2 2 + . . . + x n 2 + 2 a v e ( x 1 + x 2 + . . . + x n ) + n × a v e 2 x1^2+x2^2+...+xn^2+2ave(x1+x2+...+xn)+n\times ave^2 x12+x22+...+xn2+2ave(x1+x2+...+xn)+n×ave2
s u m = x 1 + x 2 + . . . + x n sum=x1+x2+...+xn sum=x1+x2+...+xn带入得
x 1 2 + x 2 2 + . . . + x n 2 + 2 × a v e × s u m + n × a v e 2 x1^2+x2^2+...+xn^2+2\times ave\times sum+n\times ave^2 x12+x22+...+xn2+2×ave×sum+n×ave2
那么就再维护每个块的平方和就可以在 O ( n ) O(\sqrt{n}) O(n )内求出答案了。
维护倒是不难,熟用完全平方公式 + + +注意细节即可。


代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef long double ld;

const int N=100010;
const int M=350;
int n,Q,T,L[M],R[M],pos[N];
ll ans[M],add[M],sum[M],a[N],Read,f,x,y,z;
char ch;

ll read()
{
	Read=0;
	f=1;
	ch=getchar();
	while (ch<'0'||ch>'9')
	{
		if (ch=='-') f=-f;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9')
		Read=(Read<<3)+(Read<<1)+ch-48,ch=getchar();
	return Read*f;
}

void change(int l,int r,ll z)  //修改
{
	int q=pos[l],p=pos[r];
	if (q==p)  //一个块暴力修改
	{
		for (register int i=l;i<=r;i++)
			ans[q]+=2*(a[i]+add[q])*z+z*z,a[i]+=z,sum[q]+=z;
		return;
	}
	for (register int i=l;i<=R[q];i++)
		ans[q]+=2*(a[i]+add[q])*z+z*z,a[i]+=z,sum[q]+=z;
	for (register int i=L[p];i<=r;i++)  //分开
		ans[p]+=2*(a[i]+add[p])*z+z*z,a[i]+=z,sum[p]+=z;
	for (register int i=q+1;i<p;i++)  //lazy修改
		add[i]+=z,ans[i]+=2*sum[i]*z+z*z*(R[i]-L[i]+1),sum[i]+=z*(R[i]-L[i]+1);
}

ll ask1(int l,int r)  //询问和
{
	int q=pos[l],p=pos[r];
	ll s=0;
	if (q==p)
	{
		for (register int i=l;i<=r;i++) s+=(ll)(a[i]+add[q]);  //暴力求和
		return s;
	}
	for (register int i=l;i<=R[q];i++) s+=(ll)(a[i]+add[q]);
	for (register int i=L[p];i<=r;i++) s+=(ll)(a[i]+add[p]);
	for (register int i=q+1;i<p;i++) s+=sum[i];
	return s;
}

ld ask2(int l,int r)  //询问方差
{
	int q=pos[l],p=pos[r];
	ll Ans=0,Sum=0;
	if (q==p)
	{
		for (register int i=l;i<=r;i++)  //暴力
			Sum+=a[i]+add[q];
		ld Ave=(ld)Sum/(ld)(r-l+1),s=0.0;
		for (register int i=l;i<=r;i++)
			s+=((ld)a[i]+(ld)add[q]-Ave)*((ld)a[i]+(ld)add[q]-Ave);
		return (ld)s/(ld)(r-l+1);
	}
	for (register int i=l;i<=R[q];i++)  //左边
	{
		Ans+=(a[i]+add[q])*(a[i]+add[q]);
		Sum+=a[i]+add[q];
	}
	for (register int i=L[p];i<=r;i++)  //右边
	{
		Ans+=(a[i]+add[p])*(a[i]+add[p]);
		Sum+=a[i]+add[p];
	}
	for (register int i=q+1;i<p;i++)  //中间直接利用lazy
	{
		Ans+=ans[i];
		Sum+=sum[i];
	}
	ld Ave=(ld)Sum/(ld)(r-l+1);
	return ((ld)Ans-2.0*(ld)Sum*Ave+(ld)(r-l+1)*Ave*Ave)/(ld)(r-l+1);
	//完全平方公式输出
}

int main()
{ 
	n=read(),Q=read();
	for (register int i=1;i<=n;i++)
		a[i]=read();
	T=sqrt(n);
	if (T*T<n) T++;
	for (register int i=1;i<=T;i++)
	{
		L[i]=R[i-1]+1;
		R[i]=min(i*T,n);
		for (register int j=L[i];j<=R[i];j++)
		{
			pos[j]=i;
			ans[i]+=a[j]*a[j];
			sum[i]+=a[j];
		}
	}
	while (Q--)
	{
		x=read();
		if (x==0)
		{
			x=read(),y=read();
			change(x,x,y);
		}
		else if (x==1)
		{
			x=read(),y=read(),z=read();
			change(x,y,z);
		}
		else if (x==2)
		{
			x=read(),y=read();
			printf("%lld\n",ask1(x,y));
		}
		else if (x==3)
		{
			x=read(),y=read();
			printf("%0.10Lf\n",ask2(x,y));
		}
		
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
基于hal库的OLED显示屏驱动C语言实现源码.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值