●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 ...
随机推荐
- 团队作业7——第二次项目冲刺(Beta版本12.04)
1.当天站立式会议照片 本次会议内容:1:每个人汇报自己完成的工作.2:组长分配各自要完成的任务. 2.每个人的工作 黄进勇:项目整合,后台代码. 李勇:前台界面优化. 何忠鹏:数据库模块. 郑希彬: ...
- IOS UITextView自适应高度
LOFTER app需要实现了一个类似iPhone短信输入框的功能,它的功能其实蛮简单,就是:[UITextView的高度随着内容高度的变化而变化].实现思路应该是: 在UITextView的text ...
- android 自定义ScrollView实现背景图片伸缩(阻尼效果)
android 自定义ScrollView实现强调内容背景图片伸缩(仿多米,qq空间背景的刷新) 看到一篇文章,自己更改了一下bug: 原文地址:http://www.aiuxian.com/arti ...
- tornado web高级开发项目
抽屉官网:http://dig.chouti.com/ 一.配置(settings) settings = { 'template_path': 'views', #模板文件路径 'static_pa ...
- IOS webview iframe 宽度超出屏幕解决方案
IOS 真机webview中,iframe 却不能很好地适应屏幕大小,总是超出屏幕尺寸,需要左右滚动才能看到完整页面. <div style="overflow: auto;-webk ...
- Ubuntu 17.10.1安装, 定制
p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 2018.4.7 Ubuntu 17.10.1安装, 定制, 后续搭建LAMP环境 ...
- maven多环境部署
1.首先在maven的pom.xml文件中添加profiles标签,然后分别添加3个不同环境的profile, 本例中添加了dev.test.product三个环境,这个可以根据自己的需要添加和减少. ...
- Windows用户模式下注入方式总结
注入技术在病毒木马.游戏.打补丁等编程中应用很广泛,学习该技术不仅能帮助理解Windows工作原理,还能对病毒木马技术手段有更加深刻的理解,下面我们了解下各种注入方式吧. 一.DLL注入 在注入技术中 ...
- 三十天学不会TCP,UDP/IP网络编程 -- RTT的计算
欢迎去gitbook(https://www.gitbook.com/@rogerzhu/)看到完整版. 如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,虽然说现在这种“看不见”的 ...
- 浅谈移动端适配-rem
对于移动端开发来说,无可避免的就是直面各种设备不同分辨率和不同DPR(设备像素比)的问题,在此忽略其他兼容性问题的探讨. 一. 移动端开发有关于像素的概念: 1.设备像素(dp),也叫物理像素.指设备 ...