• P4688 [Ynoi2016]掉进兔子洞


    //Pro:P4688 [Ynoi2016]掉进兔子洞
    
    //ans= r1-l1+1 + r2-l2+1 +r3-l3+1 - ∑min(cnt1[i],cnt2[i],cnt3[i])*3
    //计算cnt可以用莫队
    
    //如何计算cnt的min
    //用bitset (第一次用这玩意真神奇
    //将原数组排个序 
    //将每个数离散化为它在有序数组中出现的第一个位置
    //bitset里的每一位对应有序后的原数组的每一位 
    //那么对于一个询问,三个bitset的&就是∑min(cnt1[i],cnt2[i],cnt3[i])  
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<bitset>
    using namespace std;
    
    typedef long long LL;
    
    inline int read()
    {
        char c=getchar();int num=0;
        for(;!isdigit(c);c=getchar());
        for(;isdigit(c);c=getchar())
            num=num*10+c-'0';
        return num;
    }
    
    const int N=100000;
    const int T=25000;
    
    int n,m,bound;
    int a[N+5],b[N+5];
    int belong[N+5];
    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[T*3+5];
    bitset<N> F[T+5],f;
    
    int ans[T+5],cnt[N+5];
    bool mark[T+5];
    
    inline 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];
    }
    
    inline 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]<<'
    ';
        }
    }
    
    int S;
    int main()
    {
        n=read(),m=read();
        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<=T)
                solve(m),m=0;
            else
                solve(T),m-=T;
        }
        return 0;
    }
  • 相关阅读:
    Maven报错找不到jre
    SpringBoot学习记(一)第一个SpringBoot Web服务
    (转!)大话websocket
    (转!)Netdata---Linux系统性能实时监控平台部署
    Jmeter(四十三)WebSocket Sampler 和 Ajax Request
    Jmeter(四十二)Jmeter工作原理
    Centos7安装docker(转!)
    es6 数组去重
    数组对象根据某个值相同合并分组
    await在forEach不起作用解决【await is a reserved word】
  • 原文地址:https://www.cnblogs.com/lovewhy/p/9633599.html
Copyright © 2020-2023  润新知