zoukankan      html  css  js  c++  java
  • LOJ6283 数列分块入门7(分块)

    pushdown的addtag[x]打成addtag[i],结果WA了一次

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    using namespace std;
    const int MOD = 10007;
    int belong[100100],tagadd[100100],tagmul[100100],a[100100],sz,blocknum,n;
    void calbe(int n){
        for(int i=1;i<=n;i++)
            belong[i]=(i-1)/sz+1;
    }
    void pushdown(int x){
        for(int i=sz*(x-1)+1;i<=min(sz*x,n);i++)
            a[i]=((long long)a[i]%MOD*tagmul[x]%MOD+tagadd[x]%MOD)%MOD;
        tagmul[x]=1;
        tagadd[x]=0;
    }
    void add(int l,int r,int c){
        int lsx=belong[l];
        int rex=belong[r];
        pushdown(lsx);
        for(int i=l;i<=min(lsx*sz,r);i++){
            a[i]=(a[i]%MOD+c%MOD)%MOD;
        }
        if(lsx!=rex){
            pushdown(rex);
            for(int i=(rex-1)*sz+1;i<=r;i++)
                a[i]=(a[i]%MOD+c%MOD)%MOD;
            for(int i=lsx+1;i<=rex-1;i++)
                tagadd[i]=(tagadd[i]%MOD+c%MOD)%MOD;
        }
    }
    void mul(int l,int r,int c){
        int lsx=belong[l];
        int rex=belong[r];
        pushdown(lsx);
        for(int i=l;i<=min(lsx*sz,r);i++)
            a[i]=((long long)a[i]%MOD*c%MOD)%MOD;
        if(lsx!=rex){
            pushdown(rex);
            for(int i=(rex-1)*sz+1;i<=r;i++)
                a[i]=((long long)a[i]%MOD*c%MOD)%MOD;
            for(int i=lsx+1;i<=rex-1;i++){
                tagadd[i]=((long long)tagadd[i]%MOD*c%MOD)%MOD;
                tagmul[i]=((long long)tagmul[i]%MOD*c%MOD)%MOD;
            }
        }
    }
    int query(int r){
        return ((long long)a[r]%MOD*tagmul[belong[r]]%MOD+tagadd[belong[r]]%MOD)%MOD;
    }
    int main(){
        // freopen("a5.in","r",stdin);
        // freopen("test.out","w",stdout);
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sz=sqrt(n);
        blocknum=n/sz;
        if(n%sz)
            blocknum++;
        calbe(n);
        for(int i=1;i<=blocknum;i++)    
            tagmul[i]=1,tagadd[i]=0;
        for(int i=1;i<=n;i++){
            int opt,l,r,c;
            scanf("%d %d %d %d",&opt,&l,&r,&c);
            if(opt==0)
                add(l,r,c);
            else if(opt==1)
                mul(l,r,c);
            else
                printf("%d
    ",query(r));
        } 
        return 0;
    }
    
  • 相关阅读:
    教你用笔记本充当无线路由,wifi上网了!!!
    SQL重复记录查询
    ==、object.Equals()、object.ReferenceEquals()
    SeriesChartType
    容易被忽视的装箱问题
    [转]Anonymous type and implicit type
    as、is、GetType()
    [转]dataGridView控件DateTime列插入DateTimePicker
    .NET(C#):理解值类型/引用类型,装箱/拆箱,Object类
    通过其轴标签沿 X 轴对齐不同系列中的数据点
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10046028.html
Copyright © 2011-2022 走看看