• 2019 Multi-University Training Contest 4


    1008 K-th Closest Distance

    题意:给n个数字,m个询问,每次询问给L,R,P,K,问区间[L,R]中所有数ai都变为为|P-ai|,问第k大的数为多少?

    思路:因为是绝对值,可以理解为,在[L,R]中寻找距离P第k近的距离是多少?可以二分这个距离,满足[L,R]中[p-mid,p+mid]的个数<=k的最小的mid就是答案。主席树可以求一个区间中属于一个范围的数的个数。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll ;
    const int maxn=1e5+7;
    int n,m,cnt,root[maxn],a[maxn],x,y,k;
    struct node
    {
        int l,r,sum;
    } T[maxn*40];
    void update(int l,int r,int &x,int y,int pos)
    {
        T[++cnt]=T[y],T[cnt].sum++,x=cnt;
        if(l==r) return;
        int mid=(l+r)/2;
        if(mid>=pos) update(l,mid,T[x].l,T[y].l,pos);
        else update(mid+1,r,T[x].r,T[y].r,pos);
    }
    int query(int l,int r,int x,int y,int ql,int qr)
    {
        if(ql<=l&&qr>=r) return T[y].sum-T[x].sum;
        int mid=(l+r)/2;
        if(qr<=mid) return query(l,mid,T[x].l,T[y].l,ql,qr);
        else if(ql>mid) return query(mid+1,r,T[x].r,T[y].r,ql,qr);
        else return query(l,mid,T[x].l,T[y].l,ql,qr)+query(mid+1,r,T[x].r,T[y].r,ql,qr);
    }
    void init() // 初始化 
    {
        cnt=0;
        T[0].l=T[0].r=T[0].sum=0;
    }
    int main(void)
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            init();
            scanf("%d%d",&n,&m);
            for(int i=1; i<=n; i++)
                scanf("%d",&a[i]);
            for(int i=1; i<=n; i++)
                update(1,1e6,root[i],root[i-1],a[i]);
            int ans=0;
            for(int i=1; i<=m; i++)
            {
                int x,y,p,k;
                scanf("%d%d%d%d",&x,&y,&p,&k);
                x=x^ans,y=y^ans,p=p^ans,k=k^ans;
                int l=0,r=1e6;
                while(l<=r)
                {
                    int mid=(l+r)/2;
                    if(query(1,1e6,root[x-1],root[y],p-mid,p+mid)>=k)
                    {
                        ans=mid;
                        r=mid-1;
                    }
                    else
                        l=mid+1;
                }
                printf("%d
    ",ans);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    数据集冲突
    苹果如何设计iPad的商业模式
    IT部门应如何制定技术路线图
    关于软件测试
    c#写文件
    正则表达式语法及常用表达式。
    使用Mysql的Replication功能实现数据库同步
    CMMI=大象关冰箱?
    asp.net 中RegularExpressionValidator的bug|IE的bug?
    Singleton 模式的Java和C#的实现方法
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/11641764.html
Copyright © 2020-2023  润新知