您的位置:首页 > 其它

4821 [Sdoi2017]相关分析

2018-03-05 09:16 288 查看

题目描述:

雾。

题目分析:





题目链接:



Ac 代码:

#include <cstdio>
#include <iostream>
#define ls (o<<1)
#define rs (o<<1)|1
#define il inline
const int maxm=1e5+100;
inline int read()
{
char c=getchar(); int x=0, f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
}
double x[maxm],y[maxm];
int n,m;
namespace seg{
struct mex{
double x,y,xy,x2,adx,ady,gx,gy;
mex():gx(-1),gy(-1) {}
mex(double x,double y,double xy,double x2): x(x), y(y), xy(xy), x2(x2),adx(0),ady(0),gx(-1),gy(-1){}
} st[maxm<<2];
mex operator + (const mex &x, const mex &y) { return mex(x.x+y.x,x.y+y.y,x.xy+y.xy,x.x2+y.x2); }
il double js(double x) {return x*(x+1)*(2*x+1)/6;}
il void cover(int o,double l,double r,double s,double t)
{
mex &now=st[o];
now.gx=s,now.gy=t;
now.adx=now.ady=0;
double len=r-l+1,val=(l+r)*len/2;
now.x=len*s+val;
now.y=len*t+val;
double val2=js(r)-js(l-1);
now.xy=val2+val*(s+t)+s*t*len;
now.x2=val2+val*(s+s)+s*s*len;
}
il void add(int o,double l,double r,double s,double t)
{
mex &now=st[o];
now.ady+=s,now.adx+=t;
double len=r-l+1;
now.xy+=now.x*t+now.y*s+s*t*len;
now.x2+=now.x*(s+s)+s*s*len;
now.x+=len*s;
now.y+=len*t;
}
il void pushdown(int o,int l,int r)
{
int mid=(l+r)>>1;
if(st[o].gx!=-1||st[o].gy!=-1)
{
cover(ls,l,mid,st[o].gx,st[o].gy);
cover(rs,mid+1,r,st[o].gx,st[o].gy);
st[o].gx=st[o].gy=-1;
}
if(st[o].adx||st[o].ady)
{
add(ls,l,mid,st[o].adx,st[o].ady);
add(rs,mid+1,r,st[o].adx,st[o].ady);
st[o].adx=st[o].ady=0;
}
}
void build(int o,int l,int r)
{
if(l>=r)
{
st[o]=(mex){x[l],y[l],x[l]*y[l],x[l]*x[l]};
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
st[o]=st[ls]+st[rs];
}
void mofidy1(int o,int l,int r,int ql,int qr,double s,double t)
{
if(ql<=l&&r<=qr)
{
add(o,l,r,s,t);
return;
}
int mid=(l+r)>>1;
pushdown(o,l,r);
if(ql<=mid) mofidy1(ls,l,mid,ql,qr,s,t);
if(qr>mid) mofidy1(rs,mid+1,r,ql,qr,s,t);
st[o]=st[ls]+st[rs];
}
void mofidy2(int o,int l,int r,int ql,int qr,double s,double t)
{
if(ql<=l&&r<=qr)
{
cover(o,l,r,s,t);
return;
}
pushdown(o,l,r);
int mid=(l+r)>>1;
if(ql<=mid) mofidy2(ls,l,mid,ql,qr,s,t);
if(qr>mid) mofidy2(rs,mid+1,r,ql,qr,s,t);
st[o]=st[ls]+st[rs];
}
mex ask(int o,int l,int r,int ql,int qr)
{
mex h;
if(ql<=l&&r<=qr)
return st[o];
pushdown(o,l,r);
int mid=(l+r)>>1;
if(qr<=mid) h=ask(ls,l,mid,ql,qr);
else if(mid<ql) h=ask(rs,mid+1,r,ql,qr);
else h=ask(ls,l,mid,ql,qr)+ask(rs,mid+1,r,ql,qr);
return h;
}
il void getans(int ql,int qr)
{
mex ans=ask(1,1,n,ql,qr);
double len=qr-ql+1;
double ans1=ans.xy-ans.x*ans.y/len,ans2=ans.x2-ans.x*ans.x/len;
printf("%.10lf\n",ans1/ans2);
}
};
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
x[i]=read();
for(int i=1;i<=n;i++)
y[i]=read();
seg::build(1,1,n);
for(int i=1;i<=m;i++)
{
int opt,l,r;
double s,t;
scanf("%d%d%d",&opt,&l,&r);
if(opt==1) seg::getans(l,r);
else
{
s=read(),t=read();
if(opt==2) seg::mofidy1(1,1,n,l,r,s,t);
else seg::mofidy2(1,1,n,l,r,s,t);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: