首页 > 其他分享 >方差

方差

时间:2024-11-29 09:55:10浏览次数:5  
标签:方差 int sum mid 区间 长度 op

题目描述:

解题思路:

首先我们化简式子,画出来根号里面为 \(0\),所以分子是一个区间和,分母经过观察就是 \(n\)。

所以这个式子就是区间的平均值。

但是问题来了我们怎么求 一个区间中所有子区间的平均值的最大值?

这里需要一个结论:只有长度小于等于 \(4\) 的子区间才有用

证明:两个数的平均值一定小于等于这两个数中的较大值。因为所有长度大于等于 \(2\) 的区间都是有用的,所以一个长度大于等于 \(4\) 的区间一定可以拆分成多个长度小于 \(4\) 的区间。

那么我们用线段树维护长度为 \(2\) 和 \(3\) 的区间的和即可。

修改注意极限情况。

代码实现:

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 5e5 + 10;
int a[N], val[N], sum[N];
struct SegTree{
    int maxn[N << 2], tag[N << 2];
    void pushup(int op){
        int ls = op << 1, rs = op << 1 | 1;
        maxn[op] = max(maxn[ls], maxn[rs]);
        return;
    }
    void pushdown(int op){
        int ls = op << 1, rs = op << 1 | 1;
        if(tag[op] != 0){
            maxn[ls] += tag[op], tag[ls] += tag[op];
            maxn[rs] += tag[op], tag[rs] += tag[op];
            tag[op] = 0;
        }
        return;
    }
    void build(int l, int r, int op){
        maxn[op] = 0, tag[op] = 0;
        if(l == r) return;
        int mid = (l + r) >> 1;
        build(l, mid, op << 1);
        build(mid + 1, r, op << 1 | 1);
        pushup(op);
    }
    void update(int l, int r, int op, int x, int y, int val){
        if(x <= l && r <= y){
            tag[op] += val, maxn[op] += val;
            return;
        }
        int mid = (l + r) >> 1;
        pushdown(op);
        if(mid >= x) update(l, mid, op << 1, x, y, val);
        if(mid + 1 <= y) update(mid + 1, r, op << 1 | 1, x, y, val);
        pushup(op);
    }
    int query(int l, int r, int op, int x, int y){
        if(x <= l && r <= y) return maxn[op];
        int mid = (l + r) >> 1, res = -0x3f3f3f3f3f3f;
        pushdown(op);
        if(mid >= x) res = max(res, query(l, mid, op << 1, x, y));
        if(mid + 1 <= y) res = max(res, query(mid + 1, r, op << 1 | 1, x, y));
        pushup(op);
        return res;
    }
}t, t1;
int n, q;
void solve(){
    int op, l, r;
    cin >> op >> l >> r;
    if(op == 1){
        int x; cin >> x;
        t.update(1, n + 1, 1, l, l, x);
        if(l + 1 <= r) t.update(1, n + 1, 1, l + 1, r, 2 * x);
        t.update(1, n + 1, 1, r + 1, r + 1, x);
        if(l == r){
            t1.update(1, n + 2, 1, l, l + 2, x);
        }else if(l + 1 == r){
            t1.update(1, n + 2, 1, l, l, x);
            t1.update(1, n + 2, 1, r, r + 1, 2 * x);
            t1.update(1, n + 2, 1, r + 2, r + 2, x);
        }else{
            t1.update(1, n + 2, 1, l, l, x);
            t1.update(1, n + 2, 1, l + 1, l + 1, 2 * x);
            if(l + 2 <= r) t1.update(1, n + 2, 1, l + 2, r, 3 * x);
            t1.update(1, n + 2, 1, r + 1, r + 1, 2 * x);
            t1.update(1, n + 2, 1, r + 2, r + 2, x);
        }
    }else{
        if(l == r) cout << "1 0 1" << endl;
        else if(r == l + 1){
            if(t.query(1, n + 1, 1, l + 1, r) % 2 == 0)
                cout << "1 " << t.query(1, n + 1, 1, l + 1, r) / 2 << " 1" << endl;
            else
                cout << "1 " << t.query(1, n + 1, 1, l + 1, r) << " 2" << endl;
        }
        else if(t.query(1, n + 1, 1, l + 1, r) * 3 > t1.query(1, n + 2, 1, l + 2, r) * 2){
            if(t.query(1, n + 1, 1, l + 1, r) % 2 == 0)
                cout << "1 " << t.query(1, n + 1, 1, l + 1, r) / 2 << " 1" << endl;
            else
                cout << "1 " << t.query(1, n + 1, 1, l + 1, r) << " 2" << endl;
        }else{
            if(t1.query(1, n + 2, 1, l + 2, r) % 3 == 0)
                cout << "1 " << t1.query(1, n + 2, 1, l + 2, r) / 3 << " 1" << endl;
            else
                cout << "1 " << t1.query(1, n + 2, 1, l + 2, r) << " 3" << endl;
        }
    }
}
signed main(){
    freopen("variance.in", "r", stdin);
    freopen("variance.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> q;
    for(int i = 1; i <= n; i++)
        cin >> a[i], sum[i] = sum[i - 1] + a[i];
    t.build(1, n + 1, 1);
    for(int i = 2; i <= n; i++)
        t.update(1, n + 1, 1, i, i, sum[i] - sum[i - 2]);
    t1.build(1, n + 2, 1);
    for(int i = 3; i <= n; i++)
        t1.update(1, n + 2, 1, i, i, sum[i] - sum[i - 3]);
    while(q--) solve();
    return 0;
}
/*
5 4
1 -2 3 -4 5
2 1 5
1 2 4 4
2 1 2
2 2 4
*/

标签:方差,int,sum,mid,区间,长度,op
From: https://www.cnblogs.com/huangweiliang/p/18575749

相关文章

  • 概率论基础02_随机变量及其分布&多维随机变量及其分布&期望与方差(上)
    目录一、随机变量及其分布1、定义2、离散型随机变量及其概率分布3、连续型随机变量及其概率分布4、分布函数5、常见分布5.10-1分布5.2几何分布5.3二项分布5.4泊松分布5.5均匀分布5.6指数分布5.7正态分布5.7.1标准正态分布5.7.2正态分布标准化6、离散型......
  • 球体上的采样角度:从一般协方差矩阵到浓度参数
    我正在尝试在python中提取球体上的点。我必须定位天空中的事件并使用healpy生成地图。在测试期间,我使用了vonMises-Fisher,因为我假设$'\theta'$的方差与$'\phi'$的方差相同。一切顺利,我能够通过使用$'k=1/\sigma^2'$获得浓度参数$'k'$。我评估像素概率的函......
  • 第七章习题14-输入10个学生5门课的成绩,分别用函数实现下列功能:①计算每个学生的平均分
     ......
  • [NOIP2021] 方差
    链接鉴于\(luogu\)经常似,这里把\(Markdown\)粘过来了题目[NOIP2021]方差题目描述给定长度为\(n\)的非严格递增正整数数列\(1\lea_1\lea_2\le\cdots\lea_n\)。每次可以进行的操作是:任意选择一个正整数\(1<i<n\),将\(a_i\)变为\(a_{i-1}+a_{i+1}......
  • 第二章 你以为方差分析很简单吗?
    方差分析(AnalysisofVariance,ANOVA)放在第二章讲,是因为它和t检验同为参数检验,然而并不代表方差分析简单,相反,方差分析是我们在医学研究当中使用最为广泛,方法最为复杂的方法,咨询方差分析相关问题的客户也是非常多的。如何选择合适的方差分析模型,如何解读方差分析的结果,如何对......
  • python 计算list的方差
    python计算list的方差 importnumpyasnp#假设我们有一个包含数值的列表data=[1,2,3,4,5]#计算均值mean=np.mean(data)#计算方差variance=np.var(data)#这将使用默认的N-1作为分母(样本方差)#如果你想要总体方差(使用N作为分母),可以传入ddof=0#var......
  • Kolmogorov-Smirnov 检验 + k 样本 Anderson-Darling 检验 + 贝叶斯估计 + 期望/方差
    KS检验是基于Kolmogorovdistribution,指的是\[K=\sup_{t\in[0,1]}\left\lvertB(t)\right\rvert\]式中\(B(t)\)是布朗桥。\(K\)的累积分布函数是\[\Pr(K\lex)=1-2\sum_{k=1}^\infty(-1)^{k-1}\mathrme^{-2k^2x^2}=\frac{\sqrt{2\pi}}x\sum_{k=1}^\infty\mathrme^......
  • 线段树维护区间方差
    线段树维护区间方差方差区间方差还教室解题思路:利用线段树维护\(a_i\)与\(a_i^2\)\((1\leqi\leqn)\)两个数列,然后使用一个\(lazytag\)来记录是否进行了区间加,最后输出方差的时候使用$$s^2=\sum\limits_{i=1}^n(a_i-\overlinea)^2=(\sum\limits_{i=1}......
  • Open3D 计算点云的归一化协方差矩阵
    目录一、概述1.1原理1.2实现步骤1.3应用二、代码实现2.1关键函数2.2完整代码三、实现效果3.1原始点云3.2数据显示Open3D点云算法汇总及实战案例汇总的目录地址:Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客一、概述        计算点云的归一......
  • 【机器学习】过拟合和欠拟合、高偏差(High Bias)和高方差(High Variance)的区别、过拟合和
    引言在机器学习中,过拟合(Overfitting)是指模型在训练数据上学习得太好,以至于它捕捉到了数据中的噪声和随机波动,而不是潜在的真实关系,这导致模型在新的、未见过的数据上表现不佳;欠拟合(Underfitting)是指模型在训练数据上未能捕捉到足够的信息或模式,导致模型在训练集和测试集上......