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的时候,如果改和加的标记同时存在,那一定是先改再加,要不然加的标记已经被清 ...
随机推荐
- PPAS下安装 pg_stat_statements过程记录
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL统计信息索引页 回到顶级页面:PostgreSQL索引页 PostgreSQL中,如何安装pg_stat_sta ...
- (转)Gmail,你必须了解的12个邮件编码问题
转载地址:http://www.maildesign.cn/archives/1537 1.Gmail 不支持style=” display:none”2.Gmail不支持内嵌式CSS样式3.Gmai ...
- CC3200-LAUNCHXL驱动不能正常识别的问题
1. 本次使用利尔达的CC3200底板,完全兼容官方CC3200-LAUNCHXL,如果上电之后驱动识别为2路串口,是有问题的.原因是FT2232外接的EEPROM没有烧写固件. 2. 安装FT_Pr ...
- nodejs 实现套接字服务
nodejs实现套接字服务 一 什么是套接字 1.套接字允许一个进程他通过一个IP地址和端口与另一个进程通信,当你实现对运行在同一台服务器上的两个不同进程的进程间通信或访问一个完全不同的服务器 ...
- nodejs 文件系统
nodejs访问文件系统 所有的文件系统的调用,都需要加载fs模块,即var fs=require('fs'); nodejs提供的fs模块几乎所有的功能都有两种形式选择:异步和同步,如异步的wr ...
- WebDriver--定位元素的8种方式
在UI层面的自动化测试开发中,元素的定位与操作是基础,也是经常遇到的困难所在.webdriver提供了8种定位: 1. id定位:find_element_by_id("id值") ...
- 初识java atomic
2018-8-19 昨天看到java.util.concurrent.atomic相关的文章,之前有过留意但并未去了解,正好有空学习一下.本人理解atomic包是concurrent子包,当是为并发所 ...
- 通过 zxing 生成二维码
二维码现在随处可见,在日常的开发中,也会经常涉及到二维码的生成,特别是开发一些活动或者推广方面的功能时,二维码甚至成为必备功能点.本文介绍通过 google 的 zxing 包生成带 logo 的二维 ...
- lesson 19 A very dear cat
lesson 19 A very dear cat dear adj. 亲爱的:尊敬的:昂贵的 表示几乎不,很少的词语 rarely hardly seldom scarcely flat = apa ...
- NMAP-主机扫描
1.全面扫描 2.扫描指定段 3.ping扫描 只进行ping操作,十分隐蔽 4.无ping扫描 适用于防火墙禁止ping 5.TCP SYN扫描 6.TCP ACK扫描 7.UDP扫描 8.ICMP ...