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; }
相关文章推荐
- BZOJ 4821 [Sdoi2017]相关分析
- [sdoi2017][bzoj4821] D2T3 相关分析
- 【BZOJ4821】【SDOI2017】相关分析 [线段树]
- 4821: [Sdoi2017]相关分析
- [bzoj4821][Sdoi2017]相关分析
- ●BZOJ 4821 [Sdoi2017]相关分析
- BZOJ 4821 [Sdoi2017]相关分析 ——线段树
- [BZOJ4821][SDOI2017]相关分析(线段树)
- [BZOJ]4821: [Sdoi2017]相关分析 线段树
- [BZOJ4821][SDOI2017]相关分析-线段树
- [BZOJ4821][SDOI2017]相关分析(线段树)
- [线段树] BZOJ 4821 [Sdoi2017]相关分析
- bzoj 4821: [Sdoi2017]相关分析 线段树
- bzoj 4821: [Sdoi2017]相关分析 线段树
- 【BZOJ4821】[Sdoi2017]相关分析 线段树
- (WA)BZOJ 4821: [Sdoi2017]相关分析
- Bzoj4821 [Sdoi2017]相关分析
- 洛谷P3707 [SDOI2017]相关分析(线段树)
- 水题-sdoi2017-相关分析
- codevs 5967 [SDOI2017]相关分析