• 【洛谷P3332】【ZJOI2013】-K大数查询(整体二分)


    传送门

    也是一道树套树 整体二分简单题

    但考虑到这次是求第kk

    不是前面第kk

    所以稍稍把代码改一下

    把所有插入的数取负

    输出的时候

    这样求的就是第kk大了

    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    #define ll long long
    #define int long long
    using namespace std;
    inline int read(){
        char ch=getchar();
        int res=0,f=1;
        while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
        while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
        return res*f;
    }
    #define lc (u<<1)
    #define rc  ((u<<1)|1)
    #define mid ((l+r)>>1)
    const int N=200005;
    struct ask{
        int l,r,k,pos,op;
    }q[N],q1[N],q2[N];
    int n,m,tot,cnt,a[N],ans[N],tr[N<<2],add[N];
    inline void pushup(int u){
        tr[u]=tr[lc]+tr[rc];
    }
    inline void pushdown(int u,int l,int r){
        tr[lc]+=(mid-l+1)*add[u],tr[rc]+=(r-mid)*add[u],add[lc]+=add[u],add[rc]+=add[u],add[u]=0;
    }
    inline void update(int u,int l,int r,int st,int des,int k){
        if(st<=l&&r<=des){
            tr[u]+=(r-l+1)*k,add[u]+=k;return;
        }
        pushdown(u,l,r);
        if(st<=mid)update(lc,l,mid,st,des,k);
        if(mid<des)update(rc,mid+1,r,st,des,k);
        pushup(u);
    }
    inline ll query(int u,int l,int r,int st,int des){
        if(st<=l&&r<=des)return tr[u];
        pushdown(u,l,r);
        ll ans=0;
        if(st<=mid)ans+=query(lc,l,mid,st,des);
        if(des>mid)ans+=query(rc,mid+1,r,st,des);
        pushup(u);
        return ans;
    }
    #undef mid
    inline void solve(int l,int r,int st,int des){
    	if(l>r||st>des)return;
        if(l==r){
            for(int i=st;i<=des;i++)if(q[i].op)ans[q[i].pos]=l;
            return;
        }
        int mid=(l+r)>>1,cnt1=0,cnt2=0;
        for(int i=st;i<=des;i++){
            if(q[i].op==1){
                int tmp=query(1,1,n,q[i].l,q[i].r);
                if(q[i].k<=tmp)q1[++cnt1]=q[i];
                else q[i].k-=tmp,q2[++cnt2]=q[i];
            }
            else{
                if(q[i].k<=mid)update(1,1,n,q[i].l,q[i].r,1),q1[++cnt1]=q[i];
                else q2[++cnt2]=q[i];
            }
        }
        for(int i=1;i<=cnt1;i++)if(!q1[i].op)update(1,1,n,q1[i].l,q1[i].r,-1);
        for(int i=1;i<=cnt1;i++)q[st+i-1]=q1[i];
        for(int i=1;i<=cnt2;i++)q[st+cnt1+i-1]=q2[i];
        solve(l,mid,st,st+cnt1-1),solve(mid+1,r,st+cnt1,des);
    }
    signed main(){
        n=read(),m=read();
        for(int i=1;i<=m;i++){
            int op=read(),l=read(),r=read(),k=read();
            if(op==1)q[i]=(ask){l,r,-k,0,0};
            else q[i]=(ask){l,r,k,++tot,1};
        }
        solve(-n,n,1,m);
        for(int i=1;i<=tot;i++)cout<<-ans[i]<<'
    ';
    }
    
  • 相关阅读:
    连续型随机变量量函数的期望
    一个压缩级数的概率分布列
    采用积分近似级数
    关于超过几何分布
    最长游程问题
    基于递归方式解的两道题
    概率统计几道题目
    关于dede后台登陆后一片空白以及去除版权
    mac下安装xampp、及其之上的组件安装
    启用phpstorm代码提示功能
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366360.html
Copyright © 2020-2023  润新知