BZOJ

LOJ

洛谷


恶心的拆式子。。然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\)。

操作三可以看成初始化一遍,然后同操作二。

对于操作二的\(S,T\):

\(\sum x_i,\ \sum y_i\)就是区间加。

\(xy\to(x+S)(y+T)\to xy+xT+yS+ST\),维护了区间和后,直接加上\(xT+yS+ST\)即可。

\(x^2\to(x+S)^2\to x^2+2Sx+S^2\),同上。

除了恶心点,都很简单。注意一下标记下传顺序。

注意会爆long long,要用double存。


//25744kb	4992ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5; int x[N],y[N];
LL sum[N],sum2[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Segment_Tree
{
#define ls rt<<1
#define rs rt<<1|1
#define lson l,m,ls
#define rson m+1,r,rs
#define S N<<2
int tags[S],tagt[S];
double X,Y,XY,XX,x[S],y[S],xy[S],xx[S],initx[S],initxx[S];
bool init[S];
#undef S
#define Set(rt) tags[rt]=tagt[rt]=0, x[rt]=y[rt]=initx[rt], xx[rt]=xy[rt]=initxx[rt], init[rt]=1
#define Upd(rt,s,t,l) xy[rt]+=x[rt]*t+y[rt]*s+1.0*(l)*s*t, xx[rt]+=x[rt]*(s<<1)+1.0*(l)*s*s, x[rt]+=1.0*(l)*s, y[rt]+=1.0*(l)*t, tags[rt]+=s, tagt[rt]+=t
#define Update(rt) x[rt]=x[ls]+x[rs], y[rt]=y[ls]+y[rs], xy[rt]=xy[ls]+xy[rs], xx[rt]=xx[ls]+xx[rs]
inline void InitQuery() {X=Y=XY=XX=0;}
// inline void Print(int rt) {printf("Print: rt:%d x:%lld y:%lld xy:%lld xx:%lld\n",rt,x[rt],y[rt],xy[rt],xx[rt]);}
// void BuildInit(int l,int r,int rt)
// {
// if(l==r) {initx[rt]=inity[rt]=l, initxy[rt]=initxx[rt]=1.0*l*l; return;}
// int m=l+r>>1;
// BuildInit(lson), BuildInit(rson);
// initx[rt]=initx[ls]+initx[rs], inity[rt]=inity[ls]+inity[rs], initxy[rt]=initxy[ls]+initxy[rs], initxx[rt]=initxx[ls]+initxx[rs];
// }
void Build(int l,int r,int rt)
{
initx[rt]=sum[r]-sum[l-1], initxx[rt]=sum2[r]-sum2[l-1];
if(l==r) {x[rt]=::x[l], y[rt]=::y[l], xy[rt]=x[rt]*y[rt], xx[rt]=x[rt]*x[rt]; return;}
int m=l+r>>1;
Build(lson), Build(rson), Update(rt);
}
inline void PushDown(int rt,int m)
{
int l=ls,r=rs;
if(init[rt])
Set(l), Set(r), init[rt]=0;
if(tags[rt]||tagt[rt])
Upd(l,tags[rt],tagt[rt],(m-(m>>1))), Upd(r,tags[rt],tagt[rt],(m>>1)), tags[rt]=tagt[rt]=0;
}
void Init(int l,int r,int rt,int L,int R)
{
if(L<=l && r<=R) {Set(rt); return;}
PushDown(rt,r-l+1);
int m=l+r>>1;
if(L<=m) Init(lson,L,R);
if(m<R) Init(rson,L,R);
Update(rt);
}
void Modify(int l,int r,int rt,int L,int R,int s,int t)
{
if(L<=l && r<=R) {Upd(rt,s,t,r-l+1); return;}
PushDown(rt,r-l+1);
int m=l+r>>1;
if(L<=m) Modify(lson,L,R,s,t);
if(m<R) Modify(rson,L,R,s,t);
Update(rt);
}
void Query(int l,int r,int rt,int L,int R)
{
if(L<=l && r<=R)
{
X+=x[rt], Y+=y[rt], XY+=xy[rt], XX+=xx[rt];
return;
}
PushDown(rt,r-l+1);
int m=l+r>>1;
if(L<=m) Query(lson,L,R);
if(m<R) Query(rson,L,R);
}
}T; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now*f;
} int main()
{
// freopen("relative.in","r",stdin);
// freopen("relative.out","w",stdout); const int n=read(); int m=read();
for(int i=1; i<=n; ++i) x[i]=read();
for(int i=1; i<=n; ++i) y[i]=read();
for(int i=1; i<=n; ++i) sum[i]=sum[i-1]+i, sum2[i]=sum2[i-1]+1ll*i*i; #define S 1,n,1
T.Build(S);
for(int l,r,s,t; m--; )
switch(read())
{
case 1:
{
l=read(), r=read(), T.InitQuery(), T.Query(S,l,r);
double xba=T.X/(r-l+1), yba=T.Y/(r-l+1), up=T.XY-yba*T.X, down=T.XX-xba*T.X;
printf("%.10lf\n",up/down); break;
}
case 2:
{
l=read(), r=read(), s=read(), t=read();
T.Modify(S,l,r,s,t); break;
}
case 3:
{
l=read(), r=read(), s=read(), t=read();
T.Init(S,l,r), T.Modify(S,l,r,s,t); break;
}
} return 0;
}

BZOJ.4821.[SDOI2017]相关分析(线段树)的更多相关文章

  1. BZOJ 4821 [Sdoi2017]相关分析 ——线段树

    打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...

  2. BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精

    考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...

  3. (WA)BZOJ 4821: [Sdoi2017]相关分析

    二次联通门 : BZOJ 4821: [Sdoi2017]相关分析 2017.8.23 Updata 妈妈!!这道题卡我!!!就是不然我过!!!!! #include <cstdio> # ...

  4. ●BZOJ 4821 [Sdoi2017]相关分析

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解: 线段树是真的恶心,(也许是我的方法麻烦了一些吧)首先那个式子可以做如下化简: ...

  5. [Sdoi2017]相关分析 [线段树]

    [Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...

  6. 【BZOJ4821】[Sdoi2017]相关分析 线段树

    [BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...

  7. bzoj 4821 [Sdoi2017]相关分析

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解 做法显然 就是维护一颗线段树 里面装4个东西 区间x的和 区间y的和 区间$x^ ...

  8. 洛谷P3707 [SDOI2017]相关分析(线段树)

    题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...

  9. SDOI2017相关分析 线段树

    题目 https://loj.ac/problem/2005 思路 \[ \sum_{L}^{R}{(x_i-x)^{2}} \] \[ \sum_{L}^{R}{(x_i^2-2*x_i*x+x^{ ...

随机推荐

  1. appium 手势

    1.2 appium玩转安卓手机 智能手机发展到今天,形成了一整套有关手势操作的操作习惯,如手指左右上下滑动,及双指缩放,还有手指的滑动解锁,摇晃手机等动作.那么我们怎么在python中利用appiu ...

  2. MSTM年底总结

    项目简介 做完这个项目,自己也做了测试,功能是正常可以使用的,暂时还没有上线,这个项目是用来卖课的,我自己做的是各个种类课程的展示,登录认证,还有各个接口,还有支付环节,还有微信推送消息,加入他们要买 ...

  3. VisualSVN Server如何安装和使用

    首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http://subversion.apache.org/packages.html 这是二进制文件 ...

  4. FCN 项目部分代码学习

    下面代码由搭档注释,保存下来用作参考. github项目地址:https://github.com/shekkizh/FCN.tensorflowfrom __future__ import prin ...

  5. SVG 图像入门教程

    http://www.ruanyifeng.com/blog/2018/08/svg.html 一.概述 SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector ...

  6. fcagte.exe应用程序错误

    原文:What is Fcagte.exe and How To Fix It? Overview of Fcagte.exe What Is Fcagte.exe? Fcagte.exe is a ...

  7. Windows Azure 部署 Windows 8 虚拟机

    基本步骤其实很简单,主要有: 本地部署虚拟机 将虚拟机VHD上传至Azure 在Azure上根据VHD生成映像 利用映像生成虚拟机 下面我们开始: 1,本地部署虚拟机 首先我们需要在本地用 Hyper ...

  8. [转] whistle--全新的跨平台web调试工具

    whistle是基于Node实现的跨平台web调试代理工具,类似的工具有Windows平台上的Fiddler+Willow,基于Java实现的Charles,及公司同事基于Node实现的Livepoo ...

  9. [转] mongoDB与mongoose

    mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的 ...

  10. javascript 相关小的知识点集合

    本文主要是列出一些javascript 相关的,不限于javascript的,容易记错或者遗忘的小知识,小技巧. 1.javascript中的false 在 JavaScript,常见的 false ...