●BZOJ 4821 [Sdoi2017]相关分析
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=4821
题解:
线段树
是真的恶心,(也许是我的方法麻烦了一些吧)
首先那个式子可以做如下化简:
${a}=\frac {\sum{(}{x}_{i}-\overline{x}{)}{(}{y}_{i}-\overline{y}{)} } {\sum{(}{x}_{i}-\overline{x}{)}{(}{x}_{i}-\overline{x}{)} }$
$\;\;=\frac{{(}\sum{{x}_{i}{y}_{i}}{)}-{n}\overline{x}\overline{y}} {{(}\sum{{x}_{i}{x}_{i}}{)}-{n}\overline{x}\overline{x}}$
然后可以发现,记录区间内的:
x的和(sx),y的和(sy),x*y的和(sxy),x*x的和(sxx),再来两个lazy标记表示区间x,y增量。
以上的东西用线段树维护就可以解决掉第一个和第二个操作。
但是第三个操作怎么办呢?
我们把每个 xi = i + _xi,yi = i + _yi
然后用 _xi,_yi 去建立上述线段树,及维护和上面相同的东西:
_x的和(_sx),_y的和(_sy),_x*_y的和(_sxy),_x*_x的和(_sxx),再来两个lazy标记表示区间x,y增量。
这样就可以同样以区间修改的方式完成第三个操作。
但是接下来又来了一个问题:
对于一个询问,如何从维护得到的四元组(_sx,_sy,_sxy,_sxx),
得到用于求出答案的四元组(sx,sy,sxy,sxx)
看看如下式子:(用 ' 代替 _)
${x}_{i}\times{y}_{i}$
$={{(}{x'}_{i}+{i}{)}}\times{{(}{y'}_{i}+{i}{)}}$
$={x'_iy'_i}+{2i}{(}{x'_i+y'_i}{)}+{i^2}$
所以
$\begin{align}{sxy}&={sxy'}\\&+{2(\;\;}{{i(}x'_i+y'_i{)}}+{{{(}i+1{)}(}x'_{i+1}+y'_{i+1}{)}}+{{{(}i+2{)}(}x'_{i+2}+y'_{i+2}{)}}+\cdots{)}\\&+{(}i^2+{{(}i+1{)}}^2+{{(}i+2{)}}^2+\cdots{)}\end{align}$
所以只需再维护一些东西用于计算上面式子的中间项和末尾项即可。
即对每个区间 l~r 维护:
_sufxx:${l}\times{(}{x'}_{l}+{x'}_{l}{)} +{(l+1)}\times{(}{x'}_{l+1}+{x'}_{l+1}{)} +\cdots+ {r}\times{(}{x'}_{r}+{x'}_{r}{)}$
_sufxy:${l}\times{(}{x'}_{l}+{y'}_{l}{)} +{(l+1)}\times{(}{x'}_{l+1}+{y'}_{l+1}{)} +\cdots+ {r}\times{(}{x'}_{r}+{y'}_{r}{)}$
再预处理一个数组 ${pi2[i]}=1^2+2^2+3^2+\cdots+i^2$
然后就可以搞出四元组 (sx,sy,sxy,sxx),进而得出答案。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100500
#define filein(x) freopen(#x".out","r",stdin)
#define fileout(x) freopen(#x".out","w",stdout)
using namespace std;
double pi2[MAXN];
int x[MAXN],y[MAXN];
struct Info{
double _x,_y,_xy,_xx,_sufxy,_sufxx,_s,_t; int len;
void Clear(){
_x=_y=_xy=_xx=_sufxy=_sufxx=_s=_t=0;
}
void Modify(double s,double t,int type){
if(type==2) Clear();
_xx+=_x*s+_x*s+s*s*len;
_xy+=_x*t+_y*s+s*t*len;
_sufxx+=(s+s)*(1.0+(1+len-1))*len/2;
_sufxy+=(s+t)*(1.0+(1+len-1))*len/2;
_x+=s*len; _y+=t*len;
_s+=s; _t+=t;
}
void Update(const Info &ls,const Info &rs){
_x=ls._x+rs._x; _y=ls._y+rs._y;
_xx=ls._xx+rs._xx; _xy=ls._xy+rs._xy;
_sufxx=ls._sufxx+rs._sufxx+(rs._x+rs._x)*ls.len;
_sufxy=ls._sufxy+rs._sufxy+(rs._x+rs._y)*ls.len;
}
double Calc(const int &l){
double X,Y,XX,XY;
X=_x+(1.0*l+(l+len-1))*len/2; X=X/len;
Y=_y+(1.0*l+(l+len-1))*len/2; Y=Y/len;
XX=_xx+(_sufxx+1.0*(l-1)*(_x+_x))+(pi2[l+len-1]-pi2[l-1]);
XY=_xy+(_sufxy+1.0*(l-1)*(_x+_y))+(pi2[l+len-1]-pi2[l-1]);
return (XY-X*Y*len)/(XX-X*X*len);
}
};
struct SGT{
#define ls lson[u]
#define rs rson[u]
#define alen ((r<ar?r:ar)-(l>al?l:al)+1)
int lson[MAXN*2],rson[MAXN*2],lazy[MAXN*2],sz,rt;
Info nd[MAXN*2];
void pushup(Info &ndu,const Info &ndls,const Info &ndrs){
ndu.Update(ndls,ndrs);
}
void pushdown(int u){
nd[ls].Modify(nd[u]._s,nd[u]._t,lazy[u]),
nd[rs].Modify(nd[u]._s,nd[u]._t,lazy[u]);
lazy[ls]=max(lazy[ls],lazy[u]);
lazy[rs]=max(lazy[rs],lazy[u]);
lazy[u]=nd[u]._s=nd[u]._t=0;
}
void build(int &u,int l,int r){
u=++sz; nd[u].len=r-l+1;
if(l==r){
nd[u].Modify(x[l],y[l],2);
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(nd[u],nd[ls],nd[rs]);
}
void Modify(int u,int l,int r,int al,int ar,double s,double t,int type){
if(al<=l&&r<=ar){
lazy[u]=max(lazy[u],type);
nd[u].Modify(s,t,type);
return;
}
int mid=(l+r)>>1;
if(lazy[u]) pushdown(u);
if(al<=mid) Modify(ls,l,mid,al,ar,s,t,type);
if(mid<ar) Modify(rs,mid+1,r,al,ar,s,t,type);
pushup(nd[u],nd[ls],nd[rs]);
}
Info Query(int u,int l,int r,int al,int ar){
if(al<=l&&r<=ar) return nd[u];
int mid=(l+r)>>1; Info ret,lret,rret;
ret.Clear(); lret.Clear(); rret.Clear();
ret.len=alen; lret.len=0; rret.len=0;
if(lazy[u]) pushdown(u);
if(al<=mid) lret=Query(ls,l,mid,al,ar);
if(mid<ar) rret=Query(rs,mid+1,r,al,ar);
pushup(ret,lret,rret);
return ret;
}
#undef ls
#undef rs
#undef alen
}T;
int N,M;
void read(int &X){
static int f; static char ch;
scanf("%d",&X); return;
X=0; f=1; ch=getchar();
while(ch<'0'||'9'<ch){if(ch=='-') f=-1;ch=getchar();}
while('0'<=ch&&ch<='9'){X=X*10+ch-'0'; ch=getchar();}
X=X*f;
}
int main(){
read(N); read(M);
for(int i=1;i<=N;i++) pi2[i]=pi2[i-1]+1.0*i*i;
for(int i=1;i<=N;i++) read(x[i]),x[i]-=i;
for(int i=1;i<=N;i++) read(y[i]),y[i]-=i;
T.build(T.rt,1,N);
Info ret; int c,l,r,s,t;
for(int i=1;i<=M;i++){
read(c); read(l); read(r);
if(c==1){
ret=T.Query(T.rt,1,N,l,r);
printf("%.10lf\n",ret.Calc(l));
}
else{
read(s); read(t);
T.Modify(T.rt,1,N,l,r,s,t,c-1);
}
}
return 0;
}
●BZOJ 4821 [Sdoi2017]相关分析的更多相关文章
- (WA)BZOJ 4821: [Sdoi2017]相关分析
二次联通门 : BZOJ 4821: [Sdoi2017]相关分析 2017.8.23 Updata 妈妈!!这道题卡我!!!就是不然我过!!!!! #include <cstdio> # ...
- BZOJ.4821.[SDOI2017]相关分析(线段树)
BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...
- bzoj 4821 [Sdoi2017]相关分析
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解 做法显然 就是维护一颗线段树 里面装4个东西 区间x的和 区间y的和 区间$x^ ...
- BZOJ 4821 [Sdoi2017]相关分析 ——线段树
打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...
- BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精
考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...
- 4821: [Sdoi2017]相关分析
4821: [Sdoi2017]相关分析 链接 分析: 大力拆式子,化简,然后线段树.注意精度问题与爆longlong问题. 代码: #include<cstdio> #include&l ...
- BZOJ4817 SDOI2017 相关分析
4821: [Sdoi2017]相关分析 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Description Frank对天文 ...
- 【BZOJ4821】[SDOI2017]相关分析(线段树)
[BZOJ4821][SDOI2017]相关分析(线段树) 题面 BZOJ 洛谷 题解 看看询问要求的东西是什么.把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\ ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
随机推荐
- 《Language Implementation Patterns》之 构建语法树
如果要解释执行或转换一段语言,那么就无法在识别语法规则的同时达到目标,只有那些简单的,比如将wiki markup转换成html的功能,可以通过一遍解析来完成,这种应用叫做 syntax-direct ...
- Java课程设计报告——学生成绩管理系统
一.需求分析 1.数据存储在数据库和文件中 2.分为"教师"模块和"学生"模块. 3.学生模块提供登陆功能,登陆成功后可查询数学.Java.体育成绩 (学生学号 ...
- 老板怎么办,我们网站遭到DDoS攻击又挂了?
相信现在正在阅读此文的你,一定听说过发生在上个月的史上最大的DDoS攻击. 美国东部时间2月28日,GitHub在一瞬间遭到高达1.35Tbps的带宽攻击.这次DDoS攻击几乎可以堪称是互联网有史以来 ...
- 【learning】多项式相关(求逆、开根、除法、取模)
(首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...
- node框架express
见识到原生nodeJs服务器的恶心后,我们来用下简单好用的框架吧~ 服务器无非主要提供接口和静态文件读取,直接上代码: const express = require('express'); cons ...
- javascript实现浏览器窗口大小被改变时触发事件的方法
转载 当浏览器的窗口大小被改变时触发的事件window.onresize 为事件指定代码: 复制代码代码如下: window.onresize = function(){ } 例如: 浏览器可见区域信 ...
- istio入门(02)istio的架构和概念
Istio从逻辑上可以分为数据平面和控制平面: 数据平面主要由一系列的智能代理(Envoy)组成,管理微服务之间的网络通信 控制平面负责管理和配置这些智能代理,并动态执行策略 主要由以下组件构成 En ...
- redis入门(15)redis的数据备份和恢复
redis入门(15)redis的数据备份和恢复
- 百度echarts使用--y轴label数字太长难以全部显示
问题: 今天遇到个小问题,我们系统前端呈现使用了百度echarts.在绘制折线图的时候,因为数字过大,导致显示出现了问题. 解决方案: 左边y轴的值默认是根据我们填充进去的值来默认分割的,因为原始值就 ...
- 初识JavaScript闭包
一个问题引发的思考 在我学习javascript的事件时,有一个小任务是使用JS来实现 li 列表项在鼠标悬浮时会有背景阴影的动态效果,很自然想到用for 来为每个列表项添加onmouseover 和 ...