BZOJ4821 SDOI2017相关分析(线段树)
纯粹的码农题。维护x的和、y的和、xy的和、x2的和即可。可能会炸long long。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long double
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,a[N],b[N],L[N<<],R[N<<];
ll lazyaddx[N<<],lazyaddy[N<<],s[N],t[N];
bool lazyres[N<<];
struct data
{
ll sumx,sumy,sumxy,sqr;
data operator +(const data&a) const
{
data c;
c.sumx=sumx+a.sumx;
c.sumy=sumy+a.sumy;
c.sumxy=sumxy+a.sumxy;
c.sqr=sqr+a.sqr;
return c;
}
}tree[N<<];
void up(int k){tree[k]=tree[k<<]+tree[k<<|];}
void update(int k,ll x,ll y,bool p)
{
if (p)
{
tree[k].sumx=tree[k].sumy=s[R[k]]-s[L[k]-];
tree[k].sumxy=tree[k].sqr=t[R[k]]-t[L[k]-];
lazyaddx[k]=lazyaddy[k]=,lazyres[k]=;
}
tree[k].sqr+=x*x*(R[k]-L[k]+)+*x*tree[k].sumx;
tree[k].sumxy+=x*tree[k].sumy;
tree[k].sumx+=(R[k]-L[k]+)*x;
tree[k].sumxy+=y*tree[k].sumx;
tree[k].sumy+=(R[k]-L[k]+)*y;
lazyaddx[k]+=x,lazyaddy[k]+=y;
}
void down(int k)
{
update(k<<,lazyaddx[k],lazyaddy[k],lazyres[k]);
update(k<<|,lazyaddx[k],lazyaddy[k],lazyres[k]);
lazyaddx[k]=lazyaddy[k]=;lazyres[k]=;
}
void build(int k,int l,int r)
{
L[k]=l,R[k]=r;
if (l==r) {tree[k].sumx=a[l],tree[k].sumy=b[l],tree[k].sumxy=1ll*a[l]*b[l],tree[k].sqr=1ll*a[l]*a[l];return;}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
up(k);
}
data query(int k,int l,int r)
{
if (L[k]==l&&R[k]==r) return tree[k];
if (lazyaddx[k]||lazyaddy[k]||lazyres[k]) down(k);
int mid=L[k]+R[k]>>;
if (r<=mid) return query(k<<,l,r);
else if (l>mid) return query(k<<|,l,r);
else return query(k<<,l,mid)+query(k<<|,mid+,r);
}
void res(int k,int l,int r)
{
if (L[k]==l&&R[k]==r) {update(k,,,);return;}
if (lazyaddx[k]||lazyaddy[k]||lazyres[k]) down(k);
int mid=L[k]+R[k]>>;
if (r<=mid) res(k<<,l,r);
else if (l>mid) res(k<<|,l,r);
else res(k<<,l,mid),res(k<<|,mid+,r);
up(k);
}
void add(int k,int l,int r,int x,int y)
{
if (L[k]==l&&R[k]==r) {update(k,x,y,);return;}
if (lazyaddx[k]||lazyaddy[k]||lazyres[k]) down(k);
int mid=L[k]+R[k]>>;
if (r<=mid) add(k<<,l,r,x,y);
else if (l>mid) add(k<<|,l,r,x,y);
else add(k<<,l,mid,x,y),add(k<<|,mid+,r,x,y);
up(k);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4821.in","r",stdin);
freopen("bzoj4821.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<=n;i++) b[i]=read();
for (int i=;i<=n;i++) s[i]=s[i-]+i,t[i]=t[i-]+1ll*i*i;
build(,,n);
while (m--)
{
int op=read();
if (op==)
{
int l=read(),r=read();
data k=query(,l,r);
ll x=(ll)k.sumx/(r-l+),y=(ll)k.sumy/(r-l+);
printf("%.6lf\n",(double)((k.sumxy-k.sumx*y-k.sumy*x+x*y*(r-l+))/(k.sqr-*k.sumx*x+x*x*(r-l+))));
}
else
{
int l=read(),r=read(),x=read(),y=read();
if (op==) res(,l,r);add(,l,r,x,y);
}
}
return ;
}
BZOJ4821 SDOI2017相关分析(线段树)的更多相关文章
- 【BZOJ4821】[Sdoi2017]相关分析 线段树
[BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
- BZOJ 4821 [Sdoi2017]相关分析 ——线段树
打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...
- 洛谷P3707 [SDOI2017]相关分析(线段树)
题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...
- BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精
考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...
- BZOJ.4821.[SDOI2017]相关分析(线段树)
BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...
- SDOI2017相关分析 线段树
题目 https://loj.ac/problem/2005 思路 \[ \sum_{L}^{R}{(x_i-x)^{2}} \] \[ \sum_{L}^{R}{(x_i^2-2*x_i*x+x^{ ...
- 【BZOJ4821】【SDOI2017】相关分析 [线段树]
相关分析 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Frank对天文学非常感兴趣,他经 ...
- luogu3707 相关分析 (线段树)
把式子展开以后会发现,可以用线段树维护$x,y,x*y,x^2$分别的区间和 然后操作有区间加和区间修改 这个pushdown的时候,如果改和加的标记同时存在,那一定是先改再加,要不然加的标记已经被清 ...
随机推荐
- 北京Uber优步司机奖励政策(3月22日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Java编辑环境搭建
1.Java开发环境搭建 这里主要说的是在Windows系统下的环境搭建 JDK的安装 java的sdk简称JDK ,去其官方网站下载最近的JDK即可http://www.oracle.com/tec ...
- CentOS 7.2安装11g数据库软件
Preface Yesterday I've installed the 11g GI software on CentOS 7.2.But I still encounter som ...
- JMeter录制Web脚本
设置Firefox浏览器代理, 点击右上角的菜单: 点击选项: 点击高级: 点击设置: 点击手动配置代理, 输入本地的IP地址和端口号8888,与JMeter代理服务器的端口号保持一致: 好了,浏览器 ...
- Kotlin对象:仅一行代码就可创建安全的单例
作者:Antonio Leiva 时间:Jun 20, 2017 原文链接:https://antonioleiva.com/objects-kotlin/ Kotlin对象是Android开发人员不 ...
- TPO-15 C2 Performance on a biology exam
TPO-15 C2 Performance on a biology exam 第 1 段 1.Listen to part of a conversation between a Student a ...
- 初学Direct X(8) ——碰撞检测
初学Direct X(8) --碰撞检测 真正让一个游戏鹤立鸡群的是程序对碰撞的响应有多好,这里介绍两种检测的方法: 1) 基于边框的碰撞检测 2) 基于距离的碰撞检测 1. 基于边框的碰撞检测 1. ...
- linux学习总结----redis总结
安装 下载:打开redis官方网站,推荐下载稳定版本(stable) 解压 tar zxvf redis-3.2.5.tar.gz 复制:推荐放到usr/local目录下 sudo mv -r ...
- 《Spark 官方文档》在Mesos上运行Spark
本文转自:http://ifeve.com/spark-mesos-spark/ 在Mesos上运行Spark Spark可以在由Apache Mesos 管理的硬件集群中运行. 在Mesos集群中使 ...
- 使用清华镜像在python中pip 安装
Anaconda的安装步骤不在本文的讨论中,我们主要是学习一下如何配置conda的镜像,以及一些问题的解决过程 配置镜像 在conda安装好之后,默认的镜像是官方的,由于官网的镜像在境外,我们使用国内 ...