题面

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. Codeforces 558C Amr and Chemistry

    题意: n个数.每次能够选一个数 让其 *=2 或者 /=2 问至少操作多少次使得全部数相等. 思路: 对于每一个数,计算出这个数能够变成哪些数,以及变成那个数的最小步数,用两个数组保存 cnt[i] ...

  2. chrome自带的调试工具

    由于项目需要加载webgl对浏览器内存压力很大,需要优化内存,网上找了一下资料,极力推荐chrome的开发文档 https://developers.google.cn/web/tools/chrom ...

  3. Win8下怎样安装Win7 or Win7下怎样安装win8?

    预计非常多人可能会用U盘安装工具去去做双系统的安装(Win8下安装Win7, Win7下安装Win8).可是在安装过程中你 会发现一个问题:win7下安装win8,提示你mbr硬盘格式不能安装win8 ...

  4. excel 创建数据有效性及背景颜色

    需求:用excel做数据或者表格时经常需要在一列中给出固定的几个进行悬着,这是如果每次键盘输入降低工作效率.如果做成鼠标双击进行选择,则提高很多效率,比如需要给一列填写Pass或Failure时,具体 ...

  5. RabbitMQ/pika模块

    简介 MessageQueue用于解决跨进程.跨线程.跨应用.跨网络的通信问题. RabbitMQ使用erlang开发,在windows上使用时要先安装erlang. 官方的示例比较容易理解,可以点这 ...

  6. Highmaps的天津地图数据JSON格式

    Highmaps的天津地图数据JSON格式 Highmaps的天津地图数据JSON格式 下载链接: http://pan.baidu.com/s/1eQgxECU password: tjmj 天津地 ...

  7. WPF DataGrid 获取选中 一行 或者 多行

    WPF中DataGrid使用时,需要将其SelectedItem转换成DataRowView进行操作 然而SelectedItem 与SelectedItems DataGrid的SelectionU ...

  8. Android开发之开机自动启动应用

    package com.raycloud.wolf.autostart; import android.content.BroadcastReceiver; import android.conten ...

  9. [翻译]理解Unity的自动内存管理

    当创建对象.字符串或数组时,存储它所需的内存将从称为堆的中央池中分配.当项目不再使用时,它曾经占用的内存可以被回收并用于别的东西.在过去,通常由程序员通过适当的函数调用明确地分配和释放这些堆内存块.如 ...

  10. 用redis实现动态时间段内统计排序

    问题描述 需要根据某类数据在动态时间段内的统计值对这些数据进行排名.例如按过去24小时内点赞数排名的帖子,每隔一小时计算一次结果.以下描述均针对这个例子展开. 解决思路 针对这种问题,我的第一反应是直 ...