竞赛讨论区 > 为什么样例过不了,却能ac
头像
fyx哥哥
发布于 2022-05-14 19:56
+ 关注

为什么样例过不了,却能ac


#include<cstdio>
#pragma GCC optimize(3)
using namespace std;
const int N = 1e5+10;
typedef long long ll;
struct xds{
    int l,r;
    ll sumh,sump;
    int add,mul;
}tr[N*4];
int n,m;
ll a[N];
inline void pushup(xds&u,xds&l,xds&r){
    u.sumh=l.sumh+r.sumh;
    u.sump=l.sump+r.sump;
}
inline void eval(xds&u,int add,int mul){
    ll a=u.sumh;
    u.sumh=(u.sumh*mul+(u.r-u.l+1)*add);
    u.sump=(u.sump*mul*mul+a*2*add*mul+(u.r-u.l+1)*add*add);
    u.add=(u.add*mul+add);
    u.mul=(u.mul*mul);
}
inline void pushdown(int u){
    eval(tr[u<<1],tr[u].add,tr[u].mul);    
    eval(tr[u<<1|1],tr[u].add,tr[u].mul);  
    tr[u].add=0,tr[u].mul=1;
}
inline void pushup(int u){pushup(tr[u],tr[u<<1],tr[u<<1|1]);}
inline void build(int u,int l,int r){
    if(l==r){
        tr[u]={l,r,a[r],a[r]*a[r],0,1};
    }
    else {
        tr[u]={l,r,0,0,0,1};
        int mid=l+r>>1;
        build(u<<1,l,mid),build(u<<1|1,mid+1,r);
        pushup(u);
    }
}
inline ll query(int u,int l,int r,bool flag){
    if(l<=tr[u].l&&r>=tr[u].r){
        if(flag==0)return tr[u].sumh;
        else return tr[u].sump;
    }
    pushdown(u);
    int mid=tr[u].l+tr[u].r>>1;
    ll res(0);
    if(l<=mid)res+=query(u<<1,l,r,flag);
    if(r>mid)res+=query(u<<1|1,l,r,flag);
    return res;
}
inline void modify(int u,int l,int r,int add,int mul){
    if(tr[u].r<=r&&tr[u].l>=l){
      eval(tr[u],add,mul);
    }
    else {
        pushdown(u);
        int mid=tr[u].l+tr[u].r>>1;
        if(l<=mid)modify(u<<1,l,r,add,mul);
        if(r>mid)modify(u<<1|1,l,r,add,mul);
        pushup(u);
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i(1);i<=n;i++)scanf("%d",&a[i]);
    build(1,1,n);
    while(m--)
    {
        int op,l,r;
        ll x;
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d",&l,&r);
            printf("%lld\n",query(1,l,r,0));
        }
        else if(op==2){
             scanf("%d%d",&l,&r);
            printf("%lld\n",query(1,l,r,1));
        }
        else if(op==3){
             scanf("%d%d%lld",&l,&r,&x);
            modify(1,l,r,0,x);
        }
        else {
             scanf("%d%d%lld",&l,&r,&x);
              modify(1,l,r,1,x);
        }
    }
}


全部评论

(0) 回帖
加载中...
话题 回帖

本文相关内容

等你来战

查看全部

热门推荐