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优步司机奖励政策(1月11日~1月17日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- [ES]Elasticsearch在windows下的安装
1.环境 win7 64位 2.下载包环境 https://www.elastic.co/cn/downloads/elasticsearch 选择对应安装包 3.安装过程 解压安装包,例如我的,解压 ...
- 单目、双目和RGB-D视觉SLAM初始化比较
无论单目.双目还是RGB-D,首先是将从摄像头或者数据集中读入的图像封装成Frame类型对象: 首先都需要将彩色图像处理成灰度图像,继而将图片封装成帧. (1) 单目 mCurrentFrame = ...
- 了解Python控制流语句——while 语句
while 语句 Python 中 while 语句能够让你在条件为真的前提下重复执行某块语句. while 语句是 循环(Looping) 语句的一种.while 语句同样可以拥有 else 子句作 ...
- 【text】 文本组件说明
text文本组件:在小程序里除了文本节点以外的其他节点都无法长按选中. 原型: <text selectable="[Boolean]" space="[ensp ...
- lintcode166 链表倒数第n个节点
链表倒数第n个节点 找到单链表倒数第n个节点,保证链表中节点的最少数量为n. 思路:设置两个指针first,second指向head,first指针先向前走n,然后两个指针一起走,first指针走到末 ...
- chrome编辑器与截图
在地址栏中输入 data:text/html,<html contenteditable>即可使用编辑功能,打开控制台,ctrl + shift + p 调用命令面板,输入 capture ...
- Java进阶知识点:并发容器背后的设计理念
一.背景 容器是Java编程中使用频率很高的组件,但Java默认提供的基本容器(ArrayList,HashMap等)均不是线程安全的.当容器和多线程并发编程相遇时,程序员又该何去何从呢? 通常有两种 ...
- TensorFlow入门之MNIST最佳实践-深度学习
在上一篇<TensorFlow入门之MNIST样例代码分析>中,我们讲解了如果来用一个三层全连接网络实现手写数字识别.但是在实际运用中我们需要更有效率,更加灵活的代码.在TensorFlo ...
- CryptoZombies学习笔记——Lesson4
第四课主要介绍payable函数相关. chapter1: payable修饰函数 以太坊允许同时调用函数和eth转账.msg.value显示发送到合约的以太币数,ether是内置整型数.如果函数没有 ...