标签:Fix ++ 保留 正整数 jin zoj void == lld
1 #include <cstdio> 2 #define ll long long 3 using namespace std; 4 struct edge { ll k,l,r; }tree[10000010]; 5 ll n,Q,t,a,b,c,ans1,ans2; 6 double ans; 7 void down(ll d,ll l,ll r) 8 { 9 ll mid=l+r>>1; 10 tree[d*2].k+=tree[d].r*tree[d].r*(mid-l+1)+tree[d*2].l*2*tree[d].r,tree[d*2+1].k+=tree[d].r*tree[d].r*(r-mid)+tree[d*2+1].l*2*tree[d].r; 11 tree[d*2].l+=(mid-l+1)*tree[d].r,tree[d*2+1].l+=(r-mid)*tree[d].r,tree[d*2].r+=tree[d].r,tree[d*2+1].r+=tree[d].r,tree[d].r=0; 12 } 13 void insert(ll d,ll l,ll r,ll L,ll R,ll w) 14 { 15 if (l==L&&r==R) tree[d].k+=(R-L+1)*w*w+2*tree[d].l*w,tree[d].l+=w*(R-L+1),tree[d].r+=w; 16 else 17 { 18 ll mid=l+r>>1;down(d,l,r); 19 if (mid<L) insert(d*2+1,mid+1,r,L,R,w); else if (mid>=R) insert(d*2,l,mid,L,R,w); 20 else insert(d*2,l,mid,L,mid,w),insert(d*2+1,mid+1,r,mid+1,R,w); 21 tree[d].k=tree[d*2].k+tree[d*2+1].k,tree[d].l=tree[d*2].l+tree[d*2+1].l; 22 } 23 } 24 void Query(ll d,ll l,ll r,ll L,ll R) 25 { 26 if (l==L&&r==R) ans1+=tree[d].l,ans2+=tree[d].k; 27 else 28 { 29 ll mid=l+r>>1;down(d,l,r); 30 if (mid<L) Query(d*2+1,mid+1,r,L,R); else if (mid>=R) Query(d*2,l,mid,L,R); 31 else Query(d*2,l,mid,L,mid),Query(d*2+1,mid+1,r,mid+1,R); 32 tree[d].l=tree[d*2].l+tree[d*2+1].l,tree[d].k=tree[d*2].k+tree[d*2+1].k; 33 } 34 } 35 int main() 36 { 37 scanf("%lld%lld",&n,&Q); 38 for (ll i=1,x;i<=n;i++) scanf("%lld",&x),insert(1,1,n,i,i,x); 39 while (Q--) 40 { 41 scanf("%lld",&t),ans1=ans2=0; 42 if (t==0) scanf("%lld%lld",&a,&b),insert(1,1,n,a,a,b); 43 if (t==1) scanf("%lld%lld%lld",&a,&b,&c),insert(1,1,n,a,b,c); 44 if (t==2) scanf("%lld%lld",&a,&b),Query(1,1,n,a,b),printf("%lld\n",ans1); 45 if (t==3) 46 { 47 scanf("%lld%lld",&a,&b); 48 Query(1,1,n,a,b); 49 double x=ans1,y=ans2,z=(b-a+1); 50 ans=(double)((double)y*z-(double)x*x)/((double)z*z); 51 printf("%.4lf\n",ans); 52 } 53 } 54 }
标签:Fix ++ 保留 正整数 jin zoj void == lld
原文地址:https://www.cnblogs.com/Comfortable/p/10296006.html