P3707 [SDOI2017]相关分析
P3707 [SDOI2017]相关分析
线段树裸题?但是真的很麻烦QAQ
题目给的式子是什么不用管,大力拆开,就是\(\frac{\sum x_iy_i-\overline xy_i-\overline yx_i+\overline x\overline y}{\sum x_i^2-2x_i\overline x+\overline x^2}\)
然后发现需要维护\(\sum x,\sum y,\sum xy,\sum x^2\)
剩下的就是维护两个标记,具体自己推吧,懒得写了,看代码,咕咕咕咕
#include<bits/stdc++.h>
#define il inline
#define vd void
#define rg register
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
struct data{double xy,x,y,x2;}s[400010];
il data operator +(const data&a,const data&b){return(data){a.xy+b.xy,a.x+b.x,a.y+b.y,a.x2+b.x2};}
bool lz0[400010],lz1[400010];
double lz0x[400010],lz0y[400010];
double lz1x[400010],lz1y[400010];
#define mid ((l+r)>>1)
il double ssum(int x){return 0.50*x*(x+1);}
il double ssqr(int x){return 1.00/6*x*(x+1)*(x*2+1);}
il vd Overwrite(int x,int l,int r,double x0,double y0){
lz1[x]=1,lz0[x]=0;lz1x[x]=x0,lz1y[x]=y0;
s[x]=(data){x0*y0*(r-l+1)+(x0+y0)*ssum(r-l+1)+ssqr(r-l+1),x0*(r-l+1)+ssum(r-l+1),y0*(r-l+1)+ssum(r-l+1),x0*x0*(r-l+1)+ssqr(r-l+1)+ssum(r-l+1)*x0*2};
}
il vd Modify(int x,int l,int r,double x1,double y1){
if(!lz0[x])lz0[x]=1,lz0x[x]=lz0y[x]=0;lz0x[x]+=x1,lz0y[x]+=y1;
s[x]=s[x]+(data){s[x].x*y1+s[x].y*x1+x1*y1*(r-l+1),(r-l+1)*x1,(r-l+1)*y1,s[x].x*x1*2+x1*x1*(r-l+1)};
}
il vd down(int x,int l,int r){
if(lz1[x])Overwrite(x<<1,l,mid,lz1x[x],lz1y[x]),Overwrite(x<<1|1,mid+1,r,lz1x[x]+(mid-l+1),lz1y[x]+(mid-l+1)),lz1[x]=0;
if(lz0[x])Modify(x<<1,l,mid,lz0x[x],lz0y[x]),Modify(x<<1|1,mid+1,r,lz0x[x],lz0y[x]),lz0[x]=0;
}
double X[100010],Y[100010];
il vd build(int x,int l,int r){
if(l==r){s[x]=(data){X[l]*Y[l],X[l],Y[l],X[l]*X[l]};return;}
build(x<<1,l,mid),build(x<<1|1,mid+1,r);
s[x]=s[x<<1]+s[x<<1|1];
}
il vd update_M(int x,int l,int r,const int&L,const int&R,const double&x0,const double&y0){
if(L<=l&&r<=R)return Modify(x,l,r,x0,y0);
down(x,l,r);
if(L<=mid)update_M(x<<1,l,mid,L,R,x0,y0);
if(mid<R)update_M(x<<1|1,mid+1,r,L,R,x0,y0);
s[x]=s[x<<1]+s[x<<1|1];
}
il vd update_O(int x,int l,int r,const int&L,const int&R,const double&x0,const double&y0){
if(L<=l&&r<=R)return Overwrite(x,l,r,x0,y0);
down(x,l,r);
if(L<=mid){
update_O(x<<1,l,mid,L,R,x0,y0);
if(mid<R)update_O(x<<1|1,mid+1,r,L,R,x0+(mid-std::max(l,L)+1),y0+(mid-std::max(l,L)+1));
}else update_O(x<<1|1,mid+1,r,L,R,x0,y0);
s[x]=s[x<<1]+s[x<<1|1];
}
il data query(int x,int l,int r,const int&L,const int&R){
if(L<=l&&r<=R)return s[x];
down(x,l,r);
if(L<=mid)
if(mid<R)return query(x<<1,l,mid,L,R)+query(x<<1|1,mid+1,r,L,R);
else return query(x<<1,l,mid,L,R);
else return query(x<<1|1,mid+1,r,L,R);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("3707.in","r",stdin);
freopen("3707.out","w",stdout);
#endif
int n=gi(),m=gi();
for(rg int i=1;i<=n;++i)X[i]=gi();
for(rg int i=1;i<=n;++i)Y[i]=gi();
build(1,1,n);
int o,l,r;double S,T;
while(m--){
o=gi();l=gi(),r=gi();
if(o==1){
data D=query(1,1,n,l,r);
rg double px=D.x/(r-l+1),py=D.y/(r-l+1);
printf("%.10lf\n",(D.xy-px*D.y-py*D.x+px*py*(r-l+1))/(D.x2-2*px*D.x+px*px*(r-l+1)));
}else{
S=gi(),T=gi();
if(o==2)update_M(1,1,n,l,r,S,T);
else update_O(1,1,n,l,r,S+l-1,T+l-1);
}
}
return 0;
}
P3707 [SDOI2017]相关分析的更多相关文章
- [题目] Luogu P3707 [SDOI2017]相关分析
参考资料:[Luogu 3707] SDOI2017 相关分析 P3707 [SDOI2017]相关分析 TFRAC FRAC DFRAC \(\tfrac{\sum}{1}\) \(\frac{\s ...
- 洛谷P3707 [SDOI2017]相关分析(线段树)
题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...
- luogu P3707 [SDOI2017]相关分析
传送门 对于题目要求的东西,考虑拆开懒得拆了 ,可以发现有\(\sum x\sum y\sum x^2\sum xy\)四个变量影响最终结果,考虑维护这些值 下面记\(l,r\)为区间两端点 首先是区 ...
- AC日记——[SDOI2017]相关分析 洛谷 P3707
[SDOI2017]相关分析 思路: 裸线段树: (玄学ac): 代码: #include <bits/stdc++.h> using namespace std; #define max ...
- BZOJ4817 SDOI2017 相关分析
4821: [Sdoi2017]相关分析 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Description Frank对天文 ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
- 【BZOJ4821】[SDOI2017]相关分析(线段树)
[BZOJ4821][SDOI2017]相关分析(线段树) 题面 BZOJ 洛谷 题解 看看询问要求的东西是什么.把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\ ...
- [Luogu 3707] SDOI2017 相关分析
[Luogu 3707] SDOI2017 相关分析 前言 Capella 和 Frank 一样爱好天文学. 她常在冬季的夜晚,若有所思地望着东北方上空的五边形中,最为耀眼的一个顶点. 那一抹金黄曾带 ...
- 4821: [Sdoi2017]相关分析
4821: [Sdoi2017]相关分析 链接 分析: 大力拆式子,化简,然后线段树.注意精度问题与爆longlong问题. 代码: #include<cstdio> #include&l ...
随机推荐
- 如何在ScrollView滑动的瞬间禁用拖拽手势
如何在ScrollView滑动的瞬间禁用拖拽手势 效果: 在UIScrollView滑动的瞬间禁用pan手势,可以防止用户按着屏幕不放后导致出现的一些莫须有的bug. // // ViewContro ...
- [翻译] InstagramPhotoPicker
InstagramPhotoPicker Present Image Picker like Instagram. 展示图片选择器,像Instagram这款应用一样. Installation - 安 ...
- tomcat7换端口号调试
1.C:\tomcat\conf\server.xml中修改端口号 2.C:\tomcat\bin\startup.bat批处理文件启动tomcat 3.用ctrl+c结束批处理文件 4.调试结束
- September 09th 2017 Week 36th Saturday
Don't wait to be lonely, to recognize the value of a friend. 不要等到孤独了,才明白朋友的价值. Don't wait to be left ...
- 用eval似乎会执行结果一次性返回,结果显示的是一行
with open(r'商品资料','r',encoding='utf-8') as f1: lis_goods = eval(f1.read()) # 用eval似乎会执行结果一次性返回,结果显示的 ...
- 一个最简单的WebSocket hello world demo
服务器端代码不超过42行: const WSServer = require("./server.js"); var counter = 0; function createWeb ...
- [转]HBase高可用性的新阶段
From:http://m.csdn.net/article_pt.html?arcid=2823943 Apache HBase是一个面向线上服务的数据库,其原生支持Hadoop的特性,使其成为那些 ...
- JDK1.6在LINUX下的安装配置[转]
JDK1.6在LINUX下的安装是如何进行的呢,让我们开始我们的演示: Ubuntu Linux下jdk的安装与配置 1.JDK1.6安装准备 从sun公司网站www.sun.com下载linux版本 ...
- 4-6 R语言函数 排序
#sort:对向量进行排序;返回排好序的内容 #order:返回排好序的内容的下标/多个排序标准 > x <- data.frame(v1=1:5,v2=c(10,7,9,6,8),v3= ...
- 2879. [NOI2012]美食节【费用流】
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...