【BZOJ4821】[SDOI2017]相关分析(线段树)

题面

BZOJ

洛谷

题解

看看询问要求的东西是什么。把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\sum x^2\)

考虑修改操作。先是区间加法,对于\(\sum x,\sum y\)而言直接加就好了。

而\(\sum (x+S)^2=\sum (x^2+S^2+2Sx)\),分开维护一下也做完了。

\(\sum (x+S)(y+T)\)也只需要把括号拆开之后分开维护就行了。

另外一种是区间赋值,我们看做先令\(x_i=y_i=i\),然后再对应的加上\(S,T\)就好了。注意一下这里要把之前操作里面的\(S,T\)标记清空。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX 100100
#define lson (now<<1)
#define rson (now<<1|1)
#define ll long long
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,X[MAX],Y[MAX];
struct Node{double x,y,xy,xx,S,T;int eql;}t[MAX<<2];
Node operator+(Node a,Node b){return (Node){a.x+b.x,a.y+b.y,a.xy+b.xy,a.xx+b.xx,0,0,0};}
void pushup(int now)
{
t[now].x=t[lson].x+t[rson].x;
t[now].y=t[lson].y+t[rson].y;
t[now].xx=t[lson].xx+t[rson].xx;
t[now].xy=t[lson].xy+t[rson].xy;
}
void Build(int now,int l,int r)
{
if(l==r)
{
t[now].x=X[l],t[now].y=Y[l];
t[now].xx=t[now].x*t[now].x;
t[now].xy=t[now].x*t[now].y;
return;
}
int mid=(l+r)>>1;
Build(lson,l,mid);Build(rson,mid+1,r);
pushup(now);
}
double S1(int x){return 0.5*x*(x+1);}
double S2(int x){return 1.0/6*x*(x+1)*(x+x+1);}
void addST(int now,int l,int r,double S,double T)
{
int len=r-l+1;
t[now].xx+=len*S*S+2*S*t[now].x;
t[now].xy+=t[now].x*T+t[now].y*S+len*S*T;
t[now].x+=len*S;t[now].y+=len*T;
t[now].S+=S;t[now].T+=T;
}
void addeql(int now,int l,int r)
{
t[now].x=t[now].y=S1(r)-S1(l-1);
t[now].xx=t[now].xy=S2(r)-S2(l-1);
t[now].eql=1;t[now].S=t[now].T=0;
}
void pushdown(int now,int l,int r)
{
int mid=(l+r)>>1;
if(t[now].eql)
{
addeql(lson,l,mid);addeql(rson,mid+1,r);
t[now].eql=0;
}
if(t[now].S||t[now].T)
{
addST(lson,l,mid,t[now].S,t[now].T);
addST(rson,mid+1,r,t[now].S,t[now].T);
t[now].S=t[now].T=0;
}
}
void Modify(int now,int l,int r,int L,int R,double S,double T)
{
if(L<=l&&r<=R){addST(now,l,r,S,T);return;}
int mid=(l+r)>>1;pushdown(now,l,r);
if(L<=mid)Modify(lson,l,mid,L,R,S,T);
if(R>mid)Modify(rson,mid+1,r,L,R,S,T);
pushup(now);
}
void Modify(int now,int l,int r,int L,int R)
{
if(L<=l&&r<=R){addeql(now,l,r);return;}#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX 100100
#define lson (now<<1)
#define rson (now<<1|1)
#define ll long long
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,X[MAX],Y[MAX];
struct Node{double x,y,xy,xx,S,T;int eql;}t[MAX<<2];
Node operator+(Node a,Node b){return (Node){a.x+b.x,a.y+b.y,a.xy+b.xy,a.xx+b.xx,0,0,0};}
void pushup(int now)
{
t[now].x=t[lson].x+t[rson].x;
t[now].y=t[lson].y+t[rson].y;
t[now].xx=t[lson].xx+t[rson].xx;
t[now].xy=t[lson].xy+t[rson].xy;
}
void Build(int now,int l,int r)
{
if(l==r)
{
t[now].x=X[l],t[now].y=Y[l];
t[now].xx=t[now].x*t[now].x;
t[now].xy=t[now].x*t[now].y;
return;
}
int mid=(l+r)>>1;
Build(lson,l,mid);Build(rson,mid+1,r);
pushup(now);
}
double S1(int x){return 0.5*x*(x+1);}
double S2(int x){return 1.0/6*x*(x+1)*(x+x+1);}
void addST(int now,int l,int r,double S,double T)
{
int len=r-l+1;
t[now].xx+=len*S*S+2*S*t[now].x;
t[now].xy+=t[now].x*T+t[now].y*S+len*S*T;
t[now].x+=len*S;t[now].y+=len*T;
t[now].S+=S;t[now].T+=T;
}
void addeql(int now,int l,int r)
{
t[now].x=t[now].y=S1(r)-S1(l-1);
t[now].xx=t[now].xy=S2(r)-S2(l-1);
t[now].eql=1;t[now].S=t[now].T=0;
}
void pushdown(int now,int l,int r)
{
int mid=(l+r)>>1;
if(t[now].eql)
{
addeql(lson,l,mid);addeql(rson,mid+1,r);
t[now].eql=0;
}
if(t[now].S||t[now].T)
{
addST(lson,l,mid,t[now].S,t[now].T);
addST(rson,mid+1,r,t[now].S,t[now].T);
t[now].S=t[now].T=0;
}
}
void Modify(int now,int l,int r,int L,int R,double S,double T)
{
if(L<=l&&r<=R){addST(now,l,r,S,T);return;}
int mid=(l+r)>>1;pushdown(now,l,r);
if(L<=mid)Modify(lson,l,mid,L,R,S,T);
if(R>mid)Modify(rson,mid+1,r,L,R,S,T);
pushup(now);
}
void Modify(int now,int l,int r,int L,int R)
{
if(L<=l&&r<=R){addeql(now,l,r);return;}
int mid=(l+r)>>1;pushdown(now,l,r);
if(L<=mid)Modify(lson,l,mid,L,R);
if(R>mid)Modify(rson,mid+1,r,L,R);
pushup(now);
}
Node Query(int now,int l,int r,int L,int R)
{
if(l==L&&r==R)return t[now];
int mid=(l+r)>>1;pushdown(now,l,r);
if(R<=mid)return Query(lson,l,mid,L,R);
if(L>mid)return Query(rson,mid+1,r,L,R);
return Query(lson,l,mid,L,mid)+Query(rson,mid+1,r,mid+1,R);
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)X[i]=read();
for(int i=1;i<=n;++i)Y[i]=read();
Build(1,1,n);
while(m--)
{
int opt=read(),l=read(),r=read();
if(opt==1)
{
Node a=Query(1,1,n,l,r);
double u=a.xy-a.x*a.y/(r-l+1);
double v=a.xx-a.x*a.x/(r-l+1);
printf("%.10lf\n",u/v);
}
else
{
double S=read(),T=read();
if(opt==3)Modify(1,1,n,l,r);
Modify(1,1,n,l,r,S,T);
}
}
return 0;
} int mid=(l+r)>>1;pushdown(now,l,r);
if(L<=mid)Modify(lson,l,mid,L,R);
if(R>mid)Modify(rson,mid+1,r,L,R);
pushup(now);
}
Node Query(int now,int l,int r,int L,int R)
{
if(l==L&&r==R)return t[now];
int mid=(l+r)>>1;pushdown(now,l,r);
if(R<=mid)return Query(lson,l,mid,L,R);
if(L>mid)return Query(rson,mid+1,r,L,R);
return Query(lson,l,mid,L,mid)+Query(rson,mid+1,r,mid+1,R);
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)X[i]=read();
for(int i=1;i<=n;++i)Y[i]=read();
Build(1,1,n);
while(m--)
{
int opt=read(),l=read(),r=read();
if(opt==1)
{
Node a=Query(1,1,n,l,r);
double u=a.xy-a.x*a.y/(r-l+1);
double v=a.xx-a.x*a.x/(r-l+1);
printf("%.10lf\n",u/v);
}
else
{
double S=read(),T=read();
if(opt==3)Modify(1,1,n,l,r);
Modify(1,1,n,l,r,S,T);
}
}
return 0;
}

【BZOJ4821】[SDOI2017]相关分析(线段树)的更多相关文章

  1. 【BZOJ4821】[Sdoi2017]相关分析 线段树

    [BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...

  2. [Sdoi2017]相关分析 [线段树]

    [Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...

  3. BZOJ 4821 [Sdoi2017]相关分析 ——线段树

    打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...

  4. 洛谷P3707 [SDOI2017]相关分析(线段树)

    题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...

  5. BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精

    考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...

  6. BZOJ.4821.[SDOI2017]相关分析(线段树)

    BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...

  7. SDOI2017相关分析 线段树

    题目 https://loj.ac/problem/2005 思路 \[ \sum_{L}^{R}{(x_i-x)^{2}} \] \[ \sum_{L}^{R}{(x_i^2-2*x_i*x+x^{ ...

  8. 【BZOJ4821】【SDOI2017】相关分析 [线段树]

    相关分析 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Frank对天文学非常感兴趣,他经 ...

  9. luogu3707 相关分析 (线段树)

    把式子展开以后会发现,可以用线段树维护$x,y,x*y,x^2$分别的区间和 然后操作有区间加和区间修改 这个pushdown的时候,如果改和加的标记同时存在,那一定是先改再加,要不然加的标记已经被清 ...

  10. BZOJ4821 SDOI2017相关分析(线段树)

    纯粹的码农题.维护x的和.y的和.xy的和.x2的和即可.可能会炸long long. #include<iostream> #include<cstdio> #include ...

随机推荐

  1. 手机端@media的屏幕适配

    @media only screen and (width: 320px) { html { font-size: 16px; }} @media only screen and (width: 36 ...

  2. centos7 清除系统日志、历史记录(包括history)、登录信息

    history: # echo > .bash_history //清除保存的用户操作历史记录 # history -cw //清除所有历史 centos7 清除系统日志.历史记录.登录信息: ...

  3. js类型----你所不知道的JavaScript系列(5)

    ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型等. 1.内置类型 JavaScript 有七种内置类型: • 空值(null) • 未定义( ...

  4. Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议

    最近在做一个项目, 架构上使用了 Nginx +tomcat 集群, 且nginx下配置了SSL,tomcat no SSL,项目使用https协议 但是,明明是https url请求,发现 log里 ...

  5. Linux 磁盘与磁盘分区

    Linux 系统中所有的硬件设备都是通过文件的方式来表现和使用的,我们将这些文件称为设备文件,硬盘对应的设备文件一般被称为块设备文件.本文介绍磁盘设备在 Linux 系统中的表示方法以及如何创建磁盘分 ...

  6. Ceph分布式存储集群-硬件选择

    在规划Ceph分布式存储集群环境的时候,对硬件的选择很重要,这关乎整个Ceph集群的性能,下面梳理到一些硬件的选择标准,可供参考: 1)CPU选择Ceph metadata server会动态的重新分 ...

  7. centos6下redis cluster集群部署过程

    一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...

  8. Gerrit日常维护记录

    Gerrit代码审核工具是个好东西,尤其是在和Gitlab和Jenkins对接后,在代码控制方面有着无与伦比的优势. 在公司线上部署了一套Gerrit系统,在日常运维中,使用了很多gerrit命令,在 ...

  9. websocket(三)——基于node sockit.io的即时通讯

    通过前面的学习发现,常见的websocket虽然可以很好地实现服务端和客户端的信息传递,但二者之间传递的数据只是简单的字符串,这对事物的描述,信息的传递是非常不友好的,下面将引入socket.io,来 ...

  10. iOS APP 中H5视频默认全屏播放问题解决

    问题描述:在Android中,视频可以正常在H5页面局部播放,iOS中则自动切换至全屏模式. 查看资料得以解决,20190301记录下来. 解决方法:IOS10及以后,在 video标签页中只包含 w ...