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

    两个锅
    一个是sametag[i]==c
    另一个是a[j]不要写成a[i]

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    int belong[100100],sametag[100100],n,a[100100],sz,blocknum;
    void calbe(int n){
        for(int i=1;i<=n;i++)
            belong[i]=(i-1)/sz+1;
    }
    void check(int x){
        int f=true,num=a[sz*(x-1)+1];
        for(int i=sz*(x-1)+1;i<=min(sz*x,n);i++)
            f&=(num==a[i]);
        if(f)
            sametag[x]=num;
        else
            sametag[x]=-1;
    }
    void pushdown(int x){
        if(sametag[x]!=-1){
            for(int i=sz*(x-1)+1;i<=min(sz*x,n);i++)
                a[i]=sametag[x];
        }
    }
    int query(int l,int r,int c){
        int ans=0;
        int lsx=belong[l];
        int rex=belong[r];
        pushdown(lsx);
        for(int i=l;i<=min(lsx*sz,r);i++)
            ans+=(a[i]==c);
        if(lsx!=rex){
            pushdown(rex);
            for(int i=(rex-1)*sz+1;i<=r;i++)
                ans+=(a[i]==c);
            for(int i=lsx+1;i<=rex-1;i++)
                if(sametag[i]!=-1&&sametag[i]==c)
                    ans+=sz;
                else if(sametag[i]==-1)
                    for(int j=(i-1)*sz+1;j<=i*sz;j++)
                        ans+=(a[j]==c);
        }
        return ans;
    }
    void update(int l,int r,int c){
        int lsx=belong[l];
        int rex=belong[r];
        pushdown(lsx);
        sametag[lsx]=-1;
        for(int i=l;i<=min(lsx*sz,r);i++)
            a[i]=c;
        check(lsx);
        if(lsx!=rex){
            pushdown(rex);
            sametag[rex]=-1;
            for(int i=(rex-1)*sz+1;i<=r;i++)
                a[i]=c;
            check(rex);
            for(int i=lsx+1;i<=rex-1;i++)
                sametag[i]=c;
        }
    }
    int main(){
        // freopen("a1.in","r",stdin);
        // freopen("test.out","w",stdout);
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]);
        sz=sqrt(n);
        blocknum=n/sz;
        if(n%sz)
            blocknum++;
        calbe(n);
        for(int i=1;i<=blocknum;i++)
            check(i);
        for(int i=1;i<=n;i++){
            int l,r,c;
            scanf("%d %d %d",&l,&r,&c);
            printf("%d
    ",query(l,r,c));
            update(l,r,c);
        } 
        return 0;
    }
    
  • 相关阅读:
    vue store状态存储管理
    Git分支管理
    oracle事务不能回滚的原因
    vue教程(四)--其他实用用法补充
    vue教程(三)-slotkeep-alive的使用
    vue教程(二)--过滤器和监视改动功能
    vue教程(一)-html使用vue
    Linux后台命令导入MySQL语句
    CentOS6下的ElasticSearch运行步骤
    浅谈JAVA代码优化
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10046181.html
Copyright © 2011-2022 走看看