题面

https://www.lydsy.com/JudgeOnline/problem.php?id=4821

题解

做法显然 就是维护一颗线段树

里面装4个东西 区间x的和 区间y的和 区间$x^2$的和 区间$xy$的和

然后装4个标记 add操作对x的影响 add操作对y的影响 cover操作对x的影响 cover操作对y的影响

唯一要想一想的东西在于怎么维护顺序

我一开始的愚蠢做法是每个节点维护一个nw nw=0表示当前节点上一次受到的操作是add nw=1表示....是cover

然后每次pushdown的时候 例如当前节点的nw是0 现在我们把它pushdown 我们看左儿子 如果他的nw是1 我们就得先pushdown它的左儿子 然后在更新左儿子的值 右儿子类似

如果当前节点的nw是1 也就是cover操作 就不需要管左儿子和右儿子的nw 因为全都被cover掉了

这样复杂度是

事实上这样写很麻烦

我们不需要维护nw 因为cover操作的特殊性: cover之后就不用管之前干了什么

那么对于一个节点 如果tag1,tag2不为0 且tag3,tag4也不为0 那么我们先做tag3,tag4也就是先cover

每次cover操作的时候我们把节点的tag1,tag2设为0,也就是之前的操作全不管

这样复杂度少一个log 而且好写一些

Code

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll; ll read(){
ll x=,f=;char c=getchar();
while(c<'' || c>''){if(c=='-')f=-;c=getchar();}
while(c>='' && c<=''){x=x*+c-'';c=getchar();}
return x*f;
} struct Node{
int l,r;
long double x,y,xy,x2;
long double tag1,tag2,tag3,tag4;
//如果tag1,tag3同时有值,表示先算cover操作(tag3,tag4)再算add操作(tag1,tag2)
Node(){
x=y=xy=x2=;
} void pr(){
cout<<x<<' '<<y<<' '<<xy<<' '<<x2<<endl;
}
} tr[]; #define lc (i<<1)
#define rc (i<<1|1)
ll x[],y[]; inline long double calc_sum(int l,int r){
return (long double)(r-l+)*(l+r)/;
}
inline long double calc_sqr(int l){
return (long double)l*(l+)*(*l+)/;
}
inline long double calc_sqr(int l,int r){
return calc_sqr(r)-calc_sqr(l-);
} void update(int i){
tr[i].x=tr[lc].x+tr[rc].x;
tr[i].y=tr[lc].y+tr[rc].y;
tr[i].xy=tr[lc].xy+tr[rc].xy;
tr[i].x2=tr[lc].x2+tr[rc].x2;
} void build(int i,int l,int r){
tr[i].l=l,tr[i].r=r;
if(l==r){
tr[i].x=x[l],tr[i].y=y[l];
tr[i].x2=(long double)x[l]*x[l],tr[i].xy=(long double)x[l]*y[l];
return;
}
int md=(l+r)>>;
build(lc,l,md),build(rc,md+,r);
update(i);
} void CHANGE(int i,long double s,long double t){
tr[i].tag3=s,tr[i].tag4=t;
tr[i].tag1=tr[i].tag2=;
int len=tr[i].r-tr[i].l+;
tr[i].x=calc_sum(s+tr[i].l,s+tr[i].r);
tr[i].y=calc_sum(t+tr[i].l,t+tr[i].r);
tr[i].x2=calc_sqr(s+tr[i].l,s+tr[i].r);
tr[i].xy=s*t*len+calc_sum(tr[i].l,tr[i].r)*t+calc_sum(tr[i].l,tr[i].r)*s+calc_sqr(tr[i].l,tr[i].r);
} void pushdown2(int i){
long double s=tr[i].tag3,t=tr[i].tag4;
CHANGE(lc,s,t);
CHANGE(rc,s,t);
tr[i].tag3=tr[i].tag4=;
} void change(int i,long double s,long double t){
tr[i].tag1+=s,tr[i].tag2+=t;
int len=tr[i].r-tr[i].l+;
tr[i].x2+=*tr[i].x*s+s*s*len;
tr[i].xy+=tr[i].x*t+tr[i].y*s+s*t*len;
tr[i].x+=s*len;
tr[i].y+=t*len;
} void pushdown1(int i){
long double s=tr[i].tag1,t=tr[i].tag2;
change(lc,s,t);
change(rc,s,t);
tr[i].tag1=tr[i].tag2=;
} void pushdown(int i){
if(tr[i].tag3!= || tr[i].tag4!=){
pushdown2(i);
}
if(tr[i].tag1!= || tr[i].tag2!=){
pushdown1(i);
}
} void change1(int i,int l,int r,int s,int t){
if(tr[i].l>r || tr[i].r<l) return;
if(tr[i].l>=l && tr[i].r<=r){
change(i,s,t);
return;
}
pushdown(i);
change1(lc,l,r,s,t);
change1(rc,l,r,s,t);
update(i);
} void change2(int i,int l,int r,int s,int t){
if(tr[i].l>r || tr[i].r<l) return;
if(tr[i].l>=l && tr[i].r<=r){
CHANGE(i,s,t);
return;
}
pushdown(i);
change2(lc,l,r,s,t);
change2(rc,l,r,s,t);
update(i);
} Node query(int i,int l,int r){
Node ret;
if(tr[i].l>r || tr[i].r<l) return ret;
if(tr[i].l>=l && tr[i].r<=r) return tr[i];
pushdown(i);
Node n1,n2;
n1=query(lc,l,r);
n2=query(rc,l,r);
ret.x=n1.x+n2.x;ret.y=n1.y+n2.y;ret.xy=n1.xy+n2.xy;ret.x2=n1.x2+n2.x2;
return ret;
} void ask(int l,int r){
int len=r-l+;
Node nw=query(,l,r);
//nw.pr();
long double xba=nw.x*1.0/len,yba=nw.y*1.0/len;
long double fz=nw.xy-nw.y*xba-nw.x*yba+xba*yba*len;
long double fm=nw.x2-*nw.x*xba+xba*xba*len;
printf("%.10Lf\n",fz/fm);
} int n,m; int main(){
#ifdef LZT
freopen("in","r",stdin);
#endif
n=read(),m=read();
for(int i=;i<=n;i++) x[i]=read();
for(int i=;i<=n;i++) y[i]=read();
build(,,n);
while(m--){
int tp=read();
if(tp==){
int l=read(),r=read();
ask(l,r);
}
else if(tp==){
int l=read(),r=read(),s=read(),t=read();
change1(,l,r,s,t);
}
else if(tp==){
int l=read(),r=read(),s=read(),t=read();
change2(,l,r,s,t);
}
}
return ;
} /*
3 5
1 2 3
1 2 3
1 1 3
2 2 3 -3 2
1 1 2
3 1 2 2 1
1 1 3
*/

Review

都得开long double

一开始只开了long long 爆炸 调了半天

bzoj 4821 [Sdoi2017]相关分析的更多相关文章

  1. (WA)BZOJ 4821: [Sdoi2017]相关分析

    二次联通门 : BZOJ 4821: [Sdoi2017]相关分析 2017.8.23 Updata 妈妈!!这道题卡我!!!就是不然我过!!!!! #include <cstdio> # ...

  2. ●BZOJ 4821 [Sdoi2017]相关分析

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解: 线段树是真的恶心,(也许是我的方法麻烦了一些吧)首先那个式子可以做如下化简: ...

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

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

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

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

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

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

  6. 4821: [Sdoi2017]相关分析

    4821: [Sdoi2017]相关分析 链接 分析: 大力拆式子,化简,然后线段树.注意精度问题与爆longlong问题. 代码: #include<cstdio> #include&l ...

  7. BZOJ4817 SDOI2017 相关分析

    4821: [Sdoi2017]相关分析 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Description Frank对天文 ...

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

    [BZOJ4821][SDOI2017]相关分析(线段树) 题面 BZOJ 洛谷 题解 看看询问要求的东西是什么.把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\ ...

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

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

随机推荐

  1. JAVA WEB学习笔记(一):JDK的安装及环境变量的配置

    一.JDK的安装. JDK可以在Oracle(甲骨文)的官网下载,连接地址:http://www.oracle.com/technetwork/java/javase/downloads/index- ...

  2. openwrt 配置rsync服务

    一: rsyn简介 remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息. rsync是用 “rsyn ...

  3. linux 标准i2c接口(一)

    一:I2C设备操作方式: 1.  应用程序操作法:i2c的设备的驱动可以直接利用linux内核提供的i2c-dev.c文件提供的ioctl函数接口在应用层实现对i2c设备的读写,但是在应用层使用ioc ...

  4. dp求顺序hdu1160

    题意是仅仅求一次的顺序.先依照速度从大到小排序,速度想等到按体重增序排列. 然后基本就变成了求已定顺序序列的最长递增序列递增,跟那个求一致最大序列和的基本一致. dp[i]里存储的是到当前i最大的递增 ...

  5. MySQL alter语句

    1:删除列 ALTER TABLE [表名字] DROP [列名称] 2:增加列 ALTER TABLE [表名字] ADD [列名称] INT NOT NULL  COMMENT '注释说明' 3: ...

  6. jquery1.9是最后支持IE678

    bootstrap  需要 jquery 1.9.1或更高 jquery1.9是最后支持IE678

  7. noip2016前的话[漫谈]

    今天是11月15日,离noip2016还剩三天: 今年我也是高二了,回首一下去年的时光,真的仿佛仍在昨天,我甚至现在还清楚的记得,当年那次我们做的每一件事: 星期五,回去与室友告别,得到了祝愿,乘公交 ...

  8. 如何使用git 生成patch 和打入patch【转】

    本文转载自:http://blog.csdn.net/liuhaomatou/article/details/54410361 平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用 ...

  9. CentOS 7 安装jdk9

    1.下载jdk9 http://download.oracle.com/otn-pub/java/jdk/9.0.4+11/c2514751926b4512b076cc82f959763f/jdk-9 ...

  10. JavaScript SHA-1

    1. [文件] webtoolkit.sha1.js ~ 4KB     /****  Secure Hash Algorithm (SHA1)*  http://www.huiyi8.com/css ...