zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    换上 SansForgetica-Regular 字体,增加记忆能力
    Windows和Linux查看端口占用
    安卓打开远程调试(免root)
    debian系统解决包依赖问题的神器aptitude
    C# WinForm 实现窗体淡入淡出
    [图文教程]VS2017搭建opencv & C++ 开发环境
    C# 调用Tesseract实现OCR
    数据库工具链接阿里云MySQL数据库
    【转载】如何选择MySQL存储引擎
    java Long、Integer 、Double、Boolean类型 不能直接比较
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/11641764.html
Copyright © 2011-2022 走看看