ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SDOI2017相关分析

2020-03-18 16:55:22  阅读:254  来源: 互联网

标签:分析 int double mid isdigit SDOI2017 pushdown 相关 ql


一道线段树水题

注意别被卡精度(无时无刻都要想着强制转换double)

居然写了\(100min\),我太弱了!!!

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return f==1?x:-x;
}
const int N=1e5+4;
#define lc (p<<1)
#define rc (p<<1|1)
int n,m,a[N],b[N];
double t[N<<2],tx[N<<2],dx[N<<2],dy[N<<2],lzmx[N<<2],lzmy[N<<2],lzcx[N<<2],lzcy[N<<2];
double ans,anx,ax,ay;
inline void pushup(int p){
    t[p]=t[lc]+t[rc];
    tx[p]=tx[lc]+tx[rc];
    dx[p]=dx[lc]+dx[rc];
    dy[p]=dy[lc]+dy[rc];
}
inline void pushmo(int p,int l,int r,double x,double y){
    t[p]+=dx[p]*y+dy[p]*x+x*y*(r-l+1);
    tx[p]+=x*2*dx[p]+x*x*(r-l+1);
    dx[p]+=x*(r-l+1);
    dy[p]+=y*(r-l+1);
    lzmx[p]+=x;
    lzmy[p]+=y;
}
inline double ii(double x){
    return x*(x+1)*(x*2+1)/6;
}
inline void pushco(int p,int l,int r,double x,double y){
    lzmx[p]=lzmy[p]=0;
    t[p]=ii(r)-ii(l-1)+(x+y)*(l+r)*(r-l+1)/2+x*y*(r-l+1);
    tx[p]=ii(r)-ii(l-1)+x*2*(l+r)*(r-l+1)/2+x*x*(r-l+1);
    dx[p]=x*(r-l+1)+(double)(l+r)*(r-l+1)/2;//double
    dy[p]=y*(r-l+1)+(double)(l+r)*(r-l+1)/2;
    lzcx[p]=x;lzcy[p]=y;
}
inline void pushdown(int p,int l,int mid,int r){
    if(lzcx[p]||lzcy[p]){
        pushco(lc,l,mid,lzcx[p],lzcy[p]);
        pushco(rc,mid+1,r,lzcx[p],lzcy[p]);
        lzcx[p]=lzcy[p]=0;
    }
    if(lzmx[p]||lzmy[p]){
        pushmo(lc,l,mid,lzmx[p],lzmy[p]);
        pushmo(rc,mid+1,r,lzmx[p],lzmy[p]);
        lzmx[p]=lzmy[p]=0;
    }
}
inline void build(int p,int l,int r){
    if(l==r){
        t[p]=(double)a[l]*b[l];
        tx[p]=(double)a[l]*a[l];
        dx[p]=a[l];
        dy[p]=b[l];
        return;
    }
    int mid=(l+r)>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
    pushup(p);
}
inline void modify(int p,int l,int r,int ql,int qr,double x,double y){
    if(ql<=l&&r<=qr){
        pushmo(p,l,r,x,y);
        return;
    }
    int mid=l+r>>1;
    pushdown(p,l,mid,r);
    if(ql<=mid)modify(lc,l,mid,ql,qr,x,y);
    if(mid<qr)modify(rc,mid+1,r,ql,qr,x,y);
    pushup(p);
}
inline void cover(int p,int l,int r,int ql,int qr,double x,double y){
    if(ql<=l&&r<=qr){
        pushco(p,l,r,x,y);
        return;
    }
    int mid=l+r>>1;
    pushdown(p,l,mid,r);
    if(ql<=mid)cover(lc,l,mid,ql,qr,x,y);
    if(mid<qr)cover(rc,mid+1,r,ql,qr,x,y);
    pushup(p);
}
inline void query(int p,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr){
        ans+=t[p];
        anx+=tx[p];
        ax+=dx[p];
        ay+=dy[p]; 
        return;
    }
    int mid=l+r>>1;
    pushdown(p,l,mid,r);
    if(ql<=mid)query(lc,l,mid,ql,qr);
    if(mid<qr)query(rc,mid+1,r,ql,qr);
}
int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<=n;i++)b[i]=read();
    build(1,1,n);
    while(m--){
        static int op,l,r,x,y;
        op=read();l=read();r=read();
        if(op==1){
            ans=anx=ax=ay=0;
            query(1,1,n,l,r);
            l=r-l+1;
            printf("%.8lf\n",(ans-ax*ay/l)/(anx-ax*ax/l));
            continue;
        }
        x=read();y=read();
        if(op==2)modify(1,1,n,l,r,x,y);
        else cover(1,1,n,l,r,x,y);
    }
    return (0-0);
}

标签:分析,int,double,mid,isdigit,SDOI2017,pushdown,相关,ql
来源: https://www.cnblogs.com/aurora2004/p/12518386.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有