求大神帮忙看看

P3707 [SDOI2017] 相关分析

```cpp #include<iostream> #include<cctype> #include<cstdio> #include<algorithm> #define h -9999999999 #define N 220000 #define inf 1e9+7 #define ll long long using namespace std; inline ll read() { ll x=0,flag=1; char ch=0; while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;} while(isdigit(ch)) {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x*flag; } double a[N],b[N]; struct node { double sumx; double sumy; double sqrx; double mulv; }; node operator+(node a,node b){return (node){a.sumx+b.sumx,a.sumy+b.sumy,a.sqrx+b.sqrx,a.mulv+b.mulv};} struct Segment_Tree { #define lson (o<<1) #define rson (o<<1|1) #define mid ((int)(l+r)/2) double sumx[N*4],sumy[N*4],sqrx[N*4],mulv[N*4],addx[N*4],addy[N*4],setx[N*4],sety[N*4]; inline void pushup(ll o) { sumx[o]=sumx[lson]+sumx[rson]; sumy[o]=sumy[lson]+sumy[rson]; sqrx[o]=sqrx[lson]+sqrx[rson]; mulv[o]=mulv[lson]+mulv[rson]; } inline void pushdown(ll o,ll l,ll r) { if(setx[o]!=h||sety[o]!=h) { setx[lson]=setx[rson]=setx[o]; sety[lson]=sety[rson]=sety[o]; double l1=(mid-l+1); double l2=(r-mid); double s1=((l+mid)*l1/(2.0)); double s2=((mid+1+r)*l2/(2.0)); sumx[lson]=s1+setx[o]*l1; sumx[rson]=s2+setx[o]*l2; sumy[lson]=s1+sety[o]*l1; sumy[rson]=s2+sety[o]*l2; addx[lson]=addx[rson]=0; addy[lson]=addy[rson]=0; double s1_=((mid)*(mid+1)*(2*mid+1)-(l-1)*(l)*(2*l-1))/(6.0); double s2_=((r)*(r+1)*(2*r+1)-(mid)*(mid+1)*(2*mid+1))/(6.0); // printf("%lf %lf\n",s1,s1_); // printf("%lf %lf\n",s2,s2_); mulv[lson]=s1_+(setx[o]+sety[o])*s1+l1*(setx[o]*sety[o]); mulv[rson]=s2_+(setx[o]+sety[o])*s2+l2*(setx[o]*sety[o]); sqrx[lson]=s1_+2*setx[o]*s1+l1*(setx[o]*setx[o]); sqrx[rson]=s2_+2*setx[o]*s2+l2*(setx[o]*setx[o]); // printf("%lf %lf %lf %lf %lf %lf\n",sumx[lson],sqrx[lson],mulv[lson],sumx[rson],sqrx[rson],mulv[rson]); setx[o]=sety[o]=h; } if(addx[o]||addy[o]) { double l1=(mid-l+1); double l2=(r-mid); addx[lson]+=addx[o]; addx[rson]+=addx[o]; addy[lson]+=addy[o]; addy[rson]+=addy[o]; sqrx[lson]+=2*sumx[lson]*addx[o]+(addx[o]*addx[o])*l1; sqrx[rson]+=2*sumx[rson]*addx[o]+(addx[o]*addx[o])*l2; mulv[lson]+=addy[o]*sumx[lson] + addx[o]*sumy[lson] + (addx[o]*addy[o])*l1; mulv[rson]+=addy[o]*sumx[rson] + addx[o]*sumy[rson] + (addx[o]*addy[o])*l2; sumx[lson]+=l1*addx[o]; sumx[rson]+=l2*addx[o]; sumy[lson]+=l1*addy[o]; sumy[rson]+=l2*addy[o]; addx[o]=addy[o]=0; } } void build(ll o,ll l,ll r) { setx[o]=sety[o]=h; if(l==r) { sumx[o]=a[l]; sumy[o]=b[l]; sqrx[o]=a[l]*a[l]; mulv[o]=a[l]*b[l]; return; } build(lson,l,mid); build(rson,mid+1,r); pushup(o); } void optadd(ll o,ll l,ll r,ll ql,ll qr,double s,double t) { if(ql<=l&&r<=qr) { double len=(r-l+1); addx[o]+=s; addy[o]+=t; sqrx[o]+=2*sumx[o]*s+(s*s)*len; mulv[o]+=t*sumx[o] + s*sumy[o] + (s*t)*len; sumx[o]+=len*s; sumy[o]+=len*t; return; } pushdown(o,l,r); if(ql<=mid)optadd(lson,l,mid,ql,qr,s,t); if(qr>mid)optadd(rson,mid+1,r,ql,qr,s,t); pushup(o); } void optset(ll o,ll l,ll r,ll ql,ll qr,double s,double t) { if(ql<=l&&r<=qr) { double len=(r-l+1); // printf("%d %d %d %d\n",l,r,ql,qr); setx[o]=s; sety[o]=t; double s1=((l+r)*len)/(2.0); sumx[o]=s1+s*len; sumy[o]=s1+t*len; addx[o]=0; addy[o]=0; double s_=((r)*(r+1)*(2*r+1)-(l-1)*(l)*(2*l-1))/(6.0); mulv[o]=s_+(s+t)*s1+len*(s*t); sqrx[o]=s_+2*s*s1+len*(s*s); // printf("%lf %lf\n",s_); return; } pushdown(o,l,r); if(ql<=mid)optset(lson,l,mid,ql,qr,s,t); if(qr>mid)optset(rson,mid+1,r,ql,qr,s,t); pushup(o); } node query(ll o,ll l,ll r,ll ql,ll qr) { if(ql<=l&&r<=qr) return (node){sumx[o],sumy[o],sqrx[o],mulv[o]}; pushdown(o,l,r); node ans={0,0,0,0}; if(ql<=mid)ans=ans+query(lson,l,mid,ql,qr); if(qr>mid)ans=ans+query(rson,mid+1,r,ql,qr); return ans; } }T; int main() { // freopen("AU.out","w",stdout); ll n,m,i,flag,l,r; double x,y; n=read(); m=read(); for(i=1;i<=n;i++) scanf("%lf",&a[i]); for(i=1;i<=n;i++) scanf("%lf",&b[i]); T.build(1,1,n); for(i=1;i<=m;i++) { flag=read(); l=read(); r=read(); if(flag==1) { node k=T.query(1,1,n,l,r); double s1=k.sumx; double s2=k.sumy; double s3=k.sqrx; double s4=k.mulv; double len=(r-l+1); double up=s4-(s1*s2)/len; double down=s3-(s1*s1)/len; // printf("%lf %lf %lf %lf\n",s1,s2,s4,s3); printf("%.10lf\n",up/down); } if(flag==2) { scanf("%lf%lf",&x,&y); T.optadd(1,1,n,l,r,x,y); } if(flag==3) { scanf("%lf%lf",&x,&y); T.optset(1,1,n,l,r,x,y); } } return 0; } ```
by 大吉大利 @ 2018-07-31 14:33:35


|