3 条题解

  • -2
    @ 2021-10-11 13:33:48

    本代码需要开 O2。

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,bound,a[100010],b[100010],belong[100010],ans[25010],cnt[100010];
    bool mark[25010];
    void print(int x)
    {
        if(x<0)putchar('-'),x=-x;
        if(x>9)printf("%d",x/10);
        putchar(x%10+'0');
    }
    int read()
    {
        int x=0,f=1;
        char ch=getchar();
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')
                f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
            x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    struct LINE
    {
        int l,r,id;
        bool operator<(const LINE &A)const
        {
            return belong[l]==belong[A.l]?r<A.r:l<A.l;
        }
    }line[76000];
    bitset<100010>F[25010],f;
    void update(int pos,bool flag)
    {
        int x=a[pos];
        if(flag)
            ++cnt[x],f[x+cnt[x]-2]=1;
        else
            f[x+cnt[x]-2]=0,--cnt[x];
    }
    void solve(int t)
    {
        bound=0;
        memset(mark,0,sizeof(mark));
        memset(ans,0,sizeof(ans));
        for(int i=1;i<=t;i++)
        {
            for(int j=0;j<3;j++)
            {
                line[++bound].l=read(),
                line[bound].r=read(),
                line[bound].id=i;
                ans[i]+=line[bound].r-line[bound].l+1;
            }
        }
        sort(line+1,line+bound+1);
        f.reset();
        memset(cnt,0,sizeof(cnt));
        int L=1,R=0;
        for(int i=1;i<=bound;i++)
        {
            for(;R<line[i].r;update(++R,1));
            for(;L>line[i].l;update(--L,1));
            for(;R>line[i].r;update(R--,0));
            for(;L<line[i].l;update(L++,0));
            if(!mark[line[i].id])
                F[line[i].id]=f,mark[line[i].id]=1;
            else
                F[line[i].id]&=f;
        }
        for(int i=1;i<=t;i++)
        {
            ans[i]-=F[i].count()*3;
            cout<<ans[i]<<'\n';
        }
    }
    int main()
    {
    	n=read(),m=read();
        int S=sqrt(n);
        for(int i=1;i<=n;i++)
        {
            b[i]=read(),a[i]=b[i];
            belong[i]=(i-1)/S+1;
        }
        sort(b+1,b+n+1);
        for(int i=1;i<=n;i++)
            a[i]=lower_bound(b+1,b+n+1,a[i])-b;
        while(m)
        {
            if(m<=25000)
                solve(m),m=0;
            else
                solve(25000),m-=25000;
        }
        return 0;
    }
    

    信息

    ID
    214
    时间
    3000ms
    内存
    512MiB
    难度
    6
    标签
    (无)
    递交数
    57
    已通过
    16
    上传者