先说一下思路:

方差可以经过恒等变形变成

x12 + x22 + ... + xn2 + 2a(x1 + x2 + ... + xn) + na2

所以维护平方和、连续和即可

平均数我就不再推了……

天哪我连线段树都能写错!

写篇随笔记录一下我的易错点,顺便与大家交流一下……

void maintain(int L, int R, int o) {
int M = L + R >> , lc = o << , rc = lc | , ln = M - L + , rn = R - M;
sqrv[o] = sqrv[lc] + (addv[lc] * sumv[lc] << ) + ln * addv[lc] * addv[lc] + sqrv[rc] + (addv[rc] * sumv[rc] << ) + rn * addv[rc] * addv[rc];
sumv[o] = sumv[lc] + addv[lc] * ln + sumv[rc] + addv[rc] * rn;
return ;
}

在maintain函数中,须注意

sumv[o] = sumv[lc] + addv[lc] * ln + sumv[rc] + addv[rc] * rn;

不能偷懒,写成下面这样是错误的(想一想,为什么)

sumv[o] = sumv[lc] + sumv[rc] + addv[o] * (R - L + );

我解释一下:这样会将每段区间自己的addv[o]加上,那么query函数if(ql <= L && R <= qr)之中就不能加上add += addv[o]这句话了

void query(int L, int R, int o, LL add) {
if(ql <= L && R <= qr) {
add += addv[o]; int n = R - L + ;
_sum += sumv[o] + add * n;
_sqr += sqrv[o] + (add * sumv[o] << ) + n * add * add;
} else {
int M = L + R >> , lc = o << , rc = lc | ;
if(ql <= M) query(L, M, lc, add + addv[o]);
if(qr > M) query(M+, R, rc, add + addv[o]);
}
return ;
}

(这是个人写线段树的习惯,习惯不一样的话易错点不再适用)

完整代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <cstdlib>
using namespace std; int read() {
int x = , f = ; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -; c = getchar(); }
while(isdigit(c)){ x = x * + c - ''; c = getchar(); }
return x * f;
} #define LL long long
#define maxn 100010
struct Fraction {
LL a, b; LL gcd(LL a, LL b) {
return !b ? a : gcd(b, a % b);
} Fraction maintain() {
if(!a) { b = ; return *this; }
LL t = gcd(a, b); a /= t; b /= t;
return *this;
} Fraction operator - (const Fraction& t) const {
Fraction ans = (Fraction){ a * t.b - t.a * b, b * t.b };
return ans.maintain();
}
Fraction operator -= (const Fraction& t) {
*this = *this - t;
return *this;
} void print() {
printf("%lld/%lld\n", a, b);
return ;
}
} ;
LL sumv[maxn*], sqrv[maxn*], addv[maxn*], A[maxn]; void maintain(int L, int R, int o) {
int M = L + R >> , lc = o << , rc = lc | , ln = M - L + , rn = R - M;
sqrv[o] = sqrv[lc] + (addv[lc] * sumv[lc] << ) + ln * addv[lc] * addv[lc] + sqrv[rc] + (addv[rc] * sumv[rc] << ) + rn * addv[rc] * addv[rc];
sumv[o] = sumv[lc] + addv[lc] * ln + sumv[rc] + addv[rc] * rn;
return ;
} void build(int L, int R, int o) {
if(L == R){ sumv[o] = A[L]; sqrv[o] = A[L] * A[R]; }
else {
int M = L + R >> , lc = o << , rc = lc | ;
build(L, M, lc);
build(M+, R, rc);
maintain(L, R, o);
}
return ;
} int ql, qr; LL v;
void update(int L, int R, int o) {
if(ql <= L && R <= qr) addv[o] += v;
else {
int M = L + R >> , lc = o << , rc = lc | ;
addv[lc] += addv[o]; addv[rc] += addv[o]; addv[o] = ;
if(ql <= M) update(L, M, lc);
if(qr > M) update(M+, R, rc);
maintain(L, R, o);
}
return ;
} LL _sum, _sqr;
void query(int L, int R, int o, LL add) {
if(ql <= L && R <= qr) {
add += addv[o]; int n = R - L + ;
_sum += sumv[o] + add * n;
_sqr += sqrv[o] + (add * sumv[o] << ) + n * add * add;
} else {
int M = L + R >> , lc = o << , rc = lc | ;
if(ql <= M) query(L, M, lc, add + addv[o]);
if(qr > M) query(M+, R, rc, add + addv[o]);
}
return ;
} int main() {
int n = read(), m = read();
for(int i = ; i <= n; i++) A[i] = read();
build(, n, );
while(m--) {
int tp = read(); ql = read(); qr = read();
if(tp == ) {
v = read(); update(, n, );
} else {
_sum = _sqr = ;
query(, n, , );
Fraction ans; LL tn = qr - ql + ;
if(tp == ) { // average
ans = (Fraction){ _sum, tn };
ans.maintain();
} else { // variance
ans = (Fraction){ _sqr * tn - _sum * _sum, tn * tn };
ans.maintain();
}
ans.print();
}
} return ;
}

NOIP“对偶”题:还教室的更多相关文章

  1. noip做题记录+挑战一句话题解?

    因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...

  2. Noip前的大抱佛脚----Noip真题复习

    Noip前的大抱佛脚----Noip真题复习 Tags: Noip前的大抱佛脚 Noip2010 题目不难,但是三个半小时的话要写四道题还是需要码力,不过按照现在的实力应该不出意外可以AK的. 机器翻 ...

  3. $NOIp$做题记录

    虽然去年做了挺多了也写了篇一句话题解了但一年过去也忘得差不多了$kk$ 所以重新来整理下$kk$ $2018(4/6$ [X]积木大赛 大概讲下$O(n)$的数学方法. 我是从分治类比来的$QwQ$. ...

  4. CH Round #52 还教室[线段树 方差]

    还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...

  5. NOIP 2012 Day2T2 借教室题解

    NOIP 2012 Day2T2 借教室题解 题目传送门:http://codevs.cn/problem/1217/ 题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动 ...

  6. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  7. 历年NOIP真题总结

    前言:最近把历年的NOIP真题肝了一遍(还有3个紫题先咕掉了),主要是到1998年的提高组的题.把题目的做题简要思路搁在这儿,一个是为了考前翻一翻,想想自己的哪些思路要梳理的什么什么的,反正怎么说呢, ...

  8. NOIP原题 斗地主(20190804)

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下:3<4&l ...

  9. NOIP真题索引

    NOIP真题索引 NOIP2019 Day 1 格雷码 括号树 树上的数 Day 2 Emiya 家今天的饭 划分 树的重心 NOIP2018 Day 1 铺设道路 货币系统 赛道修建 Day 2 旅 ...

随机推荐

  1. hdu 5878 I Count Two Three (2016 ACM/ICPC Asia Regional Qingdao Online 1001)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5878 题目大意: 给出一个数n ,求一个数X, X>=n. X 满足一个条件 X= 2^a*3^ ...

  2. 如何在Flash Builder里新建ActionScript工程

    新建ActionScript工程 1. File > New > ActionScript Project 2. 按照提示完成工程的创建 使程序直接在Flash Player中运行 1. ...

  3. CentOS6.5个人目录下中文路径转英文路径

    如果安装了中文版到CentOS之后,root目录及home目录下会出现中文到路径名,如“桌面”.“文档”,“图片 .公共的” .“下载”. “音乐”.“ 视频”等目录,这样在命令行上操作十分到不方便. ...

  4. php Hash Table(一) Hash Table的结构

    关于Hash Table专题: 一直想深入理解一下php的hash table的实现,以前一直是星星点点的看看,从未彻底的总结过,那就从这个专题开始吧! 主要想总结几个部分:hashtable结构,h ...

  5. Multiple actions were found that match the request Web API

    在WebAPI工程入口不对外公开的接口不能使用public. [HttpPost] public string PostRequest([FromBody] Model model) { /// } ...

  6. SQL DatePart函数使用

    DATEPART 返回代表指定日期的指定日期部分的整数. 语法 DATEPART ( datepart ,date ) 参数 datepart 是指定应返回的日期部分的参数.下表列出了 Microso ...

  7. chain.doFilter(request,response)含义

    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...

  8. validate jquery 注册页面使用实例 详解

    官方使用文档:http://jqueryvalidation.org/documentation/ 参考资料:http://www.w3cschool.cc/jquery/jquery-plugin- ...

  9. SSLv3 Poodle攻击漏洞检测工具

    漏洞编号:CVE-2014-3566 POC如下: import ssl,socket,sys SSL_VERSION={    'SSLv2':ssl.PROTOCOL_SSLv2,    'SSL ...

  10. Spring Ioc--Bean装配

    继前一篇IoC概述.Spring容器总结,接下来总结下Bean的装配过程. 要使引用程序中的Spring容器成功启动,需要同时具备以下3个条件: 1.Spring框架的类包,放在应用程序的类路径下. ...