zoukankan      html  css  js  c++  java
  • bzoj 4571 [Scoi2016]美味——主席树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4571

    按位考虑,需要的就是一个区间;比如最高位就是(2^k -x)。

    对于不是最高位的位置该怎么考虑?其实之前位置如果能或不能匹配上,也就相当于指定了之前的位上的是0还是1;把是1的位累计进一个变量里,加到区间的边界上就行了!

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=2e5+5,M=1e5+5,K=N*20;
    int n,m,mx,a[N],rt[N],tot,sm[K],ls[K],rs[K];
    int ans,lj,lo,hi,bin[20];
    int rdn()
    {
        int ret=0;bool fx=1;char ch=getchar();
        while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}
        while(ch>='0'&&ch<='9') ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar();
        return fx?ret:-ret;
    }
    void build(int &cr,int pre,int l,int r,int v)
    {
        cr=++tot; ls[cr]=ls[pre]; rs[cr]=rs[pre];
        sm[cr]=sm[pre]+1;
        if(l==r) return; int mid=l+r>>1;
        if(v<=mid) build(ls[cr],ls[pre],l,mid,v);
        else build(rs[cr],rs[pre],mid+1,r,v);
    }
    bool query(int cr,int pre,int l,int r,int L,int R)
    {
        if(l>=L&&r<=R) return sm[cr]-sm[pre];
        int mid=l+r>>1; bool fg=0;
        if(L<=mid) fg=query(ls[cr],ls[pre],l,mid,L,R);
        if(!fg&&mid<R) fg=query(rs[cr],rs[pre],mid+1,r,L,R);
        return fg;
    }
    void init()
    {
        bin[0]=1;
        for(int i=1;i<=18;i++) bin[i]=bin[i-1]<<1;
    }
    int main()
    {
        n=rdn(); m=rdn(); init();
        for(int i=1;i<=n;i++) a[i]=rdn(),mx=max(mx,a[i]);
        for(int i=1;i<=n;i++)
            build(rt[i],rt[i-1],1,mx,a[i]);
        for(int i=1,b,x,l,r;i<=m;i++)
        {
            b=rdn(); x=rdn(); l=rdn(); r=rdn();
            ans=0;  lj=0;
            for(int j=17;j>=0;j--)
            {
                if(b&bin[j]) {lo=lj; hi=lj+bin[j]-1;}
                else {lo=lj+bin[j]; hi=lj+bin[j+1]-1;}
                hi-=x; lo-=x;
                hi=min(hi,mx); lo=max(lo,0);
    
                if(lo<=hi&&query(rt[r],rt[l-1],1,mx,lo,hi))
                    lj+=(b&bin[j]?0:bin[j]),ans+=bin[j];
                else lj+=(b&bin[j]?bin[j]:0);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    路漫漫的自学之路(1)
    feel better about yourself 完美破解MyEclipse 5.5.1 GA 注册码呵呵
    prctise .cpp & .h 的拆分
    JsDemo
    intro
    英汉词典
    曾国藩名言
    挫折
    去掉‘为帮助保护您的安全,internet explorer已经限制此文件显示可能访问您的计算机的活动内容’提示
    曾国藩对联欣赏
  • 原文地址:https://www.cnblogs.com/Narh/p/9726446.html
Copyright © 2011-2022 走看看