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;
    }
    
  • 相关阅读:
    angularjs里对JS的lowercase和uppercase的完善
    UVA
    UVA
    MySQL 8.0X的安装与卸载命令
    回文树(模板+例题)
    UESTC
    UVALive
    BZOJ
    ACM-ICPC 2018 南京赛区网络预赛 I Skr (马拉车+hash去重)或(回文树)
    ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge(状压dp)
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10046181.html
Copyright © 2011-2022 走看看