首页 > 其他分享 >[lnsyoj282/luoguP2122]还教室

[lnsyoj282/luoguP2122]还教室

时间:2024-05-22 18:40:05浏览次数:20  
标签:const lnsyoj282 LL 教室 luoguP2122 Fraction ans return sum

题意

原题链接
给定序列a,要求处理区间加,区间查平均值,区间查方差

sol

显然线段树
区间加操作请参考[lnsyoj281/luoguP2023/AHOI2009]维护序列

区间查平均值

由于$$\overline a = \frac{\sum_{i=1}^{n} a_i}{n}$$
所以只需记录区间和即可

区间查方差

由于$$S^2 = \frac{\sum_{i=1}^{n} (a_i - \overline a)^2}{n}$$
可得$$S^2 = \frac{\sum_{i=1}^{n} a_i^2 - \sum_{i=1}^{n} 2 \cdot \overline a \cdot a_i + n \cdot \overline a}{n}$$
其中,\(\sum_{i=1}^{n} a_i\)及\(\sum_{i=1}^{n} a_i^2\)均能使用线段树处理,而\(\overline a\)的处理方式前面已经处理完毕,因此该式可以计算出来

区间查平方和

下面介绍\(\sum_{i=1}^{n} a_i^2\)的处理方式:
假设序列\(a\)的每个值都加上\(x\),则平方和的值由$$\sum_{i=1}^{n} a_i^2$$
变为$$\sum_{i=1}^{n} a_i^2 - \sum_{i=1}^{n} 2 \cdot x \cdot a_i + n \cdot x$$
因此,只需要在处理区间和之前,处理区间平方和即可

代码

注:因为蒟蒻懒得想为了更方便编写题解,蒟蒻在代码中单独编写了分数(Fraction)结构体,详见代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
typedef __int128 LL;

const int N = 100005;

int n, m;
LL lazyadd[N * 4];
int a[N];

struct Node{
    LL sum = 0, square = 0;
}tree[N * 4];

LL lcm(LL x, LL y){
    return x / __gcd(x, y) * y;
}

struct Fraction{ //分数结构体
    LL x, y;

    Fraction(LL x, LL y):x(x), y(y){}

    void divide(){ //约分
        if (!x) {
            y = 1;
            return ;
        }
        LL d = __gcd(x, y);
        x /= d, y /= d;
    }

    Fraction operator-() const{
        Fraction copy(-x, y);
        return copy;
    }

    Fraction operator+(const Fraction &W) const{
        LL yy = lcm(y, W.y);
        LL atimes = yy / y, btimes = yy / W.y;
        LL xx = x * atimes + W.x * btimes;
        Fraction ans(xx, yy);
        ans.divide();
        return ans;
    }

    Fraction operator-(const Fraction &W) const{
        Fraction copy(x, y);
        return copy + (-W);
    }

    Fraction operator*(const Fraction &W) const{
        Fraction ans(x * W.x, y * W.y);
        ans.divide();
        return ans;
    }

    Fraction operator*(const LL &W) const{
        Fraction ans(x * W, y);
        ans.divide();
        return ans;
    }

    Fraction operator/(const LL &W) const{
        Fraction ans(x, y * W);
        ans.divide();
        return ans;
    }

    void print(){
        long long xx = x, yy = y;
        printf("%lld/%lld\n", xx, yy);
    }
};

void pushup(int u){
    tree[u].sum = tree[u << 1].sum + tree[u << 1 | 1].sum;
    tree[u].square = tree[u << 1].square + tree[u << 1 | 1].square;
}

void pushdown(int u, int l, int r){
    int mid = l + r >> 1;
    tree[u << 1].square += 2 * tree[u << 1].sum * lazyadd[u] + lazyadd[u] * lazyadd[u] * (mid - l + 1);
    tree[u << 1 | 1].square += 2 * tree[u << 1 | 1].sum * lazyadd[u] + lazyadd[u] * lazyadd[u] * (r - mid);
    tree[u << 1].sum += lazyadd[u] * (mid - l + 1);
    tree[u << 1 | 1].sum += lazyadd[u] * (r - mid);
    lazyadd[u << 1] += lazyadd[u];
    lazyadd[u << 1 | 1] += lazyadd[u];
    lazyadd[u] = 0;
}

void build(int u, int l, int r){
    if (l == r) {
        tree[u].sum = a[l];
        tree[u].square = a[l] * a[l];
        return ;
    }
    int mid = l + r >> 1;
    build(u << 1, l, mid);
    build(u << 1 | 1, mid + 1, r);
    pushup(u);
}

void update(int u, int l, int r, int L, int R, int val){
    if (L <= l && r <= R){
        lazyadd[u] += val;
        tree[u].square += 2 * tree[u].sum * val + val * val * (r - l + 1);
        tree[u].sum += val * (r - l + 1);
        return ;
    }
    pushdown(u, l, r);
    int mid = l + r >> 1;
    if (L <= mid) update(u << 1, l, mid, L, R, val);
    if (R > mid) update(u << 1 | 1, mid + 1, r, L, R, val);
    pushup(u);
}

LL query(int u, int l, int r, int L, int R, int op){ //op=0时,为查询区间和,op=1时,为查询区间平方和
    if (L <= l && r <= R){
        if (op) return tree[u].square;
        return tree[u].sum;
    }
    pushdown(u, l, r);
    LL res = 0, mid = l + r >> 1;
    if (L <= mid) res += query(u << 1, l, mid, L, R, op);
    if (R > mid) res += query(u << 1 | 1, mid + 1, r, L, R, op);
    return res;
}

int main(){
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
    build(1, 1, n);

    while (m -- ){
        int op;
        int l, r, k;
        scanf("%d%d%d", &op, &l, &r);
        // puts("");
        if (op == 1) {
            scanf("%d", &k);
            update(1, 1, n, l, r, k);
        }
        else {
            LL sum = query(1, 1, n, l, r, 0), cnt = r - l + 1;
            Fraction average(sum, cnt); //平均值
            average.divide();
            if (op == 2) average.print();
            else {
                LL Square = query(1, 1, n, l, r, 1);
                Fraction square(Square, 1);
                Fraction varience(1, cnt);
                varience = varience * (square - average * 2 * sum + average * average * (r - l + 1)); //方差
                varience.divide();
                varience.print();
            }
        }
    }
}

标签:const,lnsyoj282,LL,教室,luoguP2122,Fraction,ans,return,sum
From: https://www.cnblogs.com/XiaoJuRuoUP/p/18205126/lnsyoj282_luoguP2122

相关文章

  • 关于征集参与《智慧教室建设服务评价技术要求》团体标准起草单位的通知
    根据2023年团体标准管理制修订计划安排,为使标准更具专业性、实用性和可操作性,吸纳行业内有代表性的骨干企业和专家作为起草单位和起草人,现就我单位牵头申报的《智慧教室建设服务评价技术要求》团体标准公开征集起草单位和起草人。一、申请标准起草单位的机构必须具备以......
  • 基于51单片机教室智能台灯路灯控制激光计数光照控灯设计21-764
    21-764、51智能灯光控制系统的设计-LCD1602-激光-光照-KEY-高亮产品功能描述:本设计由STC89C52单片机核心板电路+LCD1602液晶显示电路+激光光电对射传感器电路+光敏电阻模块电路+按键电路+高亮灯电路+电源电路组成。1、通激光光电对射传感器检测人数。2、LCD1602液晶实时显......
  • 基于深度学习的教室人员检测系统(网页版+YOLOv8_v7_v6_v5代码+训练数据集)
    摘要:本文深入研究了基于YOLOv8/v7/v6/v5的教室人员检测系统,核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法,进行性能指标对比;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码,及基于Streamlit的交互式Web应用界面设计。在Web网页中可以支持图像、视频和实时摄......
  • 极域电子教室解除控制
    文章目录前言法一、法三、前言学校机房里的极域很烦人,会影响到我们的工作下面分享几个可以破解极域的方法。法一、(推荐指数:3)右键桌面图标,点击文件所在位置。将程序全选并右键删除。点击重试点击跳过(若对话框没有消失则重复2)win+l,重新登陆好好工作吧#缺点:老师......
  • 基于Springboot框架高校学校自习室教室座位预约系统设计与实现(安装部署+源码+文档)
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • [附源码]计算机毕业设计高校多媒体教室预约系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着信息技术在教育领域的广泛应用,多媒体教室成为高校教学资源的重要组成部分。合理高效的预约管理系统对于充分利用多媒体教室资源、提高教学质量和效率具有显......
  • 基于Java+Springboot框架自习室教室座位预约系统设计与实现
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • 基于51单片机的教室灯控制【光照,手动自动,LCD1602】(仿真)
    教室光控1、系统分为自动模式和手动模式2、自动模式:根据光照强度调节亮灯的数量3、手动模式:按键控制灯的亮灭4、LCD1602显示系统状态#include"lcd1602.h"voiddelay_uint(uinti){ while(i--);}/*************************************************************......
  • 一 503. 借教室 (差分|二分)
    503.借教室(差分|二分)importjava.util.*;publicclassMain{privatestaticintn,m;privatestaticint[]rooms;privatestaticint[][]orders;privatestaticbooleancheck(intmid){long[]diff=newlong[n+2];f......
  • 智慧教室预约(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图 项目介绍随着教育数字化转型的深入,智慧教室成为提升教学质量和效率的重要环境。智慧教室预约系统能够有效管理教学资源,实现教室使用的优化配置,确保设备高效利用。它......