分块70pts求调
  • 板块P1471 方差
  • 楼主Lucky_Luo
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/11/10 17:07
  • 上次更新2023/10/27 03:31:07
查看原帖
分块70pts求调
664063
Lucky_Luo楼主2022/11/10 17:07
#include<bits/stdc++.h>
#define u(x) (((x)-1)/block+1)
#define len(x) (((x) == block+1) ? (n%block) : (block))
#define sqr(x) ((x)*(x))
#define N 100005
using namespace std;
int i, j, m, n, op, l, r, q, block;
double v, a[N], s[N], sq[N], t[N];
double sum(int l, int r)
{
	double ans=0.0000;
	if (u(l) == u(r))
	{
		for (i=l; i<=r; i++) ans += a[i] + t[u(i)];
		return ans/(r-l+1);
	}
	for (i=l; u(i)==u(l); i++) ans += a[i] + t[u(i)];
	for (i=r; u(i)==u(r); i--) ans += a[i] + t[u(i)];
	for (i=u(l)+1; i<u(r); i++) ans += s[i] + t[i]*len(i);
	return ans/(r-l+1);
}
double sqsum(int l, int r)
{
	double ans=0.0000, as=0.0000;
	if (u(l) == u(r))
	{
		for (i=l; i<=r; i++) ans += sqr(a[i] + t[u(i)]);
		for (i=l; i<=r; i++) as += a[i] + t[u(i)];
		return ans/(r-l+1)-sqr(as/(r-l+1));
	}
	for (i=l; u(i)==u(l); i++) ans += sqr(a[i] + t[u(i)]);
	for (i=l; u(i)==u(l); i++) as += a[i] + t[u(i)];
	for (i=r; u(i)==u(r); i--) ans += sqr(a[i] + t[u(i)]);
	for (i=r; u(i)==u(r); i--) as += a[i] + t[u(i)];
	for (i=u(l)+1; i<u(r); i++) ans += sq[i] + 2*t[i]*s[i] + len(i)*sqr(t[i]);
	for (i=u(l)+1; i<u(r); i++) as += s[i] + t[i]*len(i);
	return ans/(r-l+1)-sqr(as/(r-l+1));
}
void add(int l, int r, double v)
{
	if (u(l) == u(r))
	{
		for (i=l; i<=r; i++) 
		{
			sq[u(i)] += 2*v*a[i] + sqr(v);
			a[i] += v;
			s[u(i)] += v;
		}
		return;
	}
	for (i=l; u(i)==u(l); i++) 
	{
		sq[u(i)] += 2*v*a[i] + sqr(v);
		a[i] += v;
		s[u(i)] += v;
	}
	for (i=r; u(i)==u(r); i--) 
	{
		sq[u(i)] += 2*v*a[i] + sqr(v);
		a[i] += v;
		s[u(i)] += v;
	}
	for (i=u(l)+1; i<u(r); i++) t[i] += v;
}
int main()
{
	scanf("%d %d", &n, &q);
	for (i=1; i<=n; i++) scanf("%lf", &a[i]);
	block = sqrt(n);
	for (i=1; i<=n; i++) 
	{
		s[u(i)] += a[i];
		sq[u(i)] += sqr(a[i]);
	}
	while (q--)
	{
		scanf("%d %d %d", &op, &l, &r);
		if (op == 1)
		{
			scanf("%lf", &v);
			add(l, r, v);
		}
		else if (op == 2) printf("%.4lf\n", sum(l, r));
		else printf("%.4lf\n", sqsum(l, r));
	}
}
2022/11/10 17:07
加载中...