luogu3707 相关分析 (线段树)
把式子展开以后会发现,可以用线段树维护$x,y,x*y,x^2$分别的区间和
然后操作有区间加和区间修改
这个pushdown的时候,如果改和加的标记同时存在,那一定是先改再加,要不然加的标记已经被清掉了
所以在pushdown的时候,如果有改的标记,要把孩子的加的标记清掉
然后注意细节就行了(用*传数组 然后在函数里改了的话 它真的会改的 怎么就意识不到呢...)
#include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=1e5+,inf=1e9; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
double x,y,xy,x2;
int l,r;
Node(double a=,double b=,double c=,double d=,int e=,int f=){
x=a,y=b,xy=c,x2=d,l=e,r=f;
}
}tr[maxn*];
double laz[maxn*][];
int ch[maxn*][],pct,X[maxn],Y[maxn];
int N,M; Node operator + (Node a,Node b){
Node p;
p.l=a.l,p.r=b.r;
p.x=a.x+b.x,p.y=a.y+b.y;
p.xy=a.xy+b.xy,p.x2=a.x2+b.x2;
return p;
} inline void deal(Node &p,double *v){
int r=p.r,l=p.l;
if(v[]!=-inf){
p.x=p.y=1ll*(p.r+p.l)*(p.r-p.l+)/;
p.xy=p.x2=(1ll*r*(r+)*(*r+))/-(1ll*(l-)*l*(*l-))/;
v[]+=v[],v[]+=v[];
} p.x2+=(p.r-p.l+)*v[]*v[]+*v[]*p.x;
p.xy+=v[]*p.y+v[]*p.x+(p.r-p.l+)*v[]*v[];
p.x+=(p.r-p.l+)*v[],p.y+=(p.r-p.l+)*v[];
if(v[]!=-inf) v[]-=v[],v[]-=v[];
} inline void pushdown(int p){
// return;
if(!ch[p][]) return;
if(laz[p][]==&&laz[p][]==&&laz[p][]==-inf) return;
int a=ch[p][],b=ch[p][];
if(laz[p][]!=-inf){
laz[a][]=laz[a][]=laz[b][]=laz[b][]=;
laz[a][]=laz[p][],laz[a][]=laz[p][];
laz[b][]=laz[p][],laz[b][]=laz[p][];
}
laz[a][]+=laz[p][],laz[a][]+=laz[p][];
laz[b][]+=laz[p][],laz[b][]+=laz[p][]; deal(tr[a],laz[p]);
deal(tr[b],laz[p]);
laz[p][]=laz[p][]=,laz[p][]=laz[p][]=-inf;
} void build(int &p,int l,int r){
p=++pct;
laz[p][]=laz[p][]=-inf;
if(l==r){
tr[p]=Node(X[l],Y[l],1ll*X[l]*Y[l],1ll*X[l]*X[l],l,r);
}else{
int m=l+r>>;
build(ch[p][],l,m);
build(ch[p][],m+,r);
tr[p]=tr[ch[p][]]+tr[ch[p][]];
}
} void query(int p,int l,int r,int x,int y,Node &q){
pushdown(p);
if(x<=l&&r<=y){
if(!q.l) q=tr[p];
else q=q+tr[p];
}else{
int m=l+r>>;
if(x<=m) query(ch[p][],l,m,x,y,q);
if(y>=m+) query(ch[p][],m+,r,x,y,q);
}
} void add(int p,int l,int r,int x,int y,int s,int t){
pushdown(p);
if(x<=l&&r<=y){
double v[];
v[]=s,v[]=t;v[]=v[]=-inf;
deal(tr[p],v);
laz[p][]+=s,laz[p][]+=t;
pushdown(p);
}else{
int m=l+r>>;
if(x<=m) add(ch[p][],l,m,x,y,s,t);
if(y>=m+) add(ch[p][],m+,r,x,y,s,t);
tr[p]=tr[ch[p][]]+tr[ch[p][]];
}
} void change(int p,int l,int r,int x,int y,int s,int t){
if(x<=l&&r<=y){
double v[];
v[]=v[]=,v[]=s,v[]=t;
deal(tr[p],v);
laz[p][]=laz[p][]=,laz[p][]=s,laz[p][]=t;
pushdown(p);
}else{
pushdown(p);
int m=l+r>>;
if(x<=m) change(ch[p][],l,m,x,y,s,t);
if(y>=m+) change(ch[p][],m+,r,x,y,s,t);
tr[p]=tr[ch[p][]]+tr[ch[p][]];
}
} int main(){
int i,j,k;
N=rd(),M=rd();
for(i=;i<=N;i++) X[i]=rd();
for(i=;i<=N;i++) Y[i]=rd();
build(i,,N);
for(i=;i<=M;i++){
int a=rd(),b=rd(),c=rd();
if(a==){
Node p;
query(,,N,b,c,p);
double xb=p.x/(c-b+),yb=p.y/(c-b+);
double ans=;
ans=p.xy-xb*p.y-yb*p.x+xb*yb*(c-b+);
ans/=p.x2-*xb*p.x+xb*xb*(c-b+);
printf("%.10lf\n",ans);
}else{
int d=rd(),e=rd();
if(a==){
add(,,N,b,c,d,e);
}else if(a==){
change(,,N,b,c,d,e);
}
}
}
return ;
}
luogu3707 相关分析 (线段树)的更多相关文章
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
- 【BZOJ4821】【SDOI2017】相关分析 [线段树]
相关分析 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Frank对天文学非常感兴趣,他经 ...
- 【BZOJ4821】[Sdoi2017]相关分析 线段树
[BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...
- 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^{ ...
- LOJ #2005. 「SDOI2017」相关分析 线段树维护回归直线方程
题目描述 \(Frank\) 对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. \(Frank\) 不仅喜欢观测,还喜欢分析观测到的 ...
随机推荐
- 搭建SpringBoot+dubbo+zookeeper+maven框架(一)
这几天项目还没来,所以就自己试着参考网上的一些资料,搭建了一个SpringBoot+dubbo+zookeeper+maven框架,网上参考的很多资料照着他们一步一步搭建,最后很多都运行不通,很是郁闷 ...
- 微信小程序日常开发中常遇到的错误代码
在开发过程中,会遇到很多微信返回的状态码,鬼知道代表什么意思,现在好了,整理总结了一份状态码,方便大家. 微信小程序错误码参考 状态码(场景值) 说明 -1 系统繁忙 0 请求成功 40001 ...
- cp 命令有坑
cp 是个很常用的命令, 基本语法为 cp -v a b 把文件a 复制为文件b(-v为显示做了什么,这是非常安全的做法,建议新手添加此参数) 参数说明: -a:此选项通常在复制目录时使用, ...
- 基于uFUN开发板和扩展板的联网校准时钟
项目概述 上周在uFUN试用群里看到管理员说试用活动快结束了,要抓紧完成评测总结,看大家的评测总结也都写了,我也不能落后啊!正好最近做的扩展板到手了,于是赶紧进行调试,做了一个不用校准的时钟,时钟这种 ...
- win8系统本地服务网络受限cpu占用率过高解决方案
今天更新软件时突然就打不开软件了,接着cpu就飙升. 打开任务管理器看到是“本地服务网络受限”这么一个东西占用的cpu最高. 在网上找到的解决方案无效的: 1.关闭家庭组(服务里的homegroup· ...
- json模块 & pickle模块
之前学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所 ...
- ngx_pagespeed-nginx前端优化模块介绍
ngx_pagespeed是Nginx的一个扩展模块,借助pagespeed,为Nginx网站服务器提速.主要的功能是针对前端页面而进行服务器端的优化,对前端设计人员来说,可以省去优化css.js以及 ...
- Docker容器学习梳理 - 基础知识(1)
Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...
- javascript DOM操作中的insertAdjacentHTML方法
插入HTML内容与文本内容以前用的是innerHTML与innerText方法,今天看到insertAdjacentHTML和 insertAdjacentText两个API,特地学习一下: inse ...
- Linux内核读书笔记第四周
进程管理 1.进程描述符及任务结构 进程存放在叫做任务队列(task list)的双向循环链表中.链表中的每一项包含一个具体进程的所有信息,类型为task_struct,称为进程描述符(process ...