题目描述

You have an array: a1, a2, , an and you must answer for some queries.
For each query, you are given an interval [L, R] and two numbers p and K. Your goal is to find the Kth closest distance between p and aL, aL+1, ..., aR.
The distance between p and ai is equal to |p - ai|.
For example:
A = {31, 2, 5, 45, 4 } and L = 2, R = 5, p = 3, K = 2.
|p - a2| = 1, |p - a3| = 2, |p - a4| = 42, |p - a5| = 1.
Sorted distance is {1, 1, 2, 42}. Thus, the 2nd closest distance is 1.

输入

The first line of the input contains an integer T (1 <= T <= 3) denoting the number of test cases.
For each test case:
The first line contains two integers n and m (1 <= n, m <= 10^5) denoting the size of array and number of queries.
The second line contains n space-separated integers a1, a2, ..., an (1 <= ai <= 10^6). Each value of array is unique.
Each of the next m lines contains four integers L', R', p' and K'.
From these 4 numbers, you must get a real query L, R, p, K like this: 
L = L' xor X, R = R' xor X, p = p' xor X, K = K' xor X, where X is just previous answer and at the beginning, X = 0.
(1 <= L < R <= n, 1 <= p <= 10^6, 1 <= K <= 169, R - L + 1 >= K).

输出

For each query print a single line containing the Kth closest distance between p and aL, aL+1, ..., aR.

样例输入

1
5 2
31 2 5 45 4
1 5 5 1
2 5 3 2

样例输出

0
1
题意
给一个序列A,每次询问L,R,p,k,输出[L,R]区间中第k大的|p-a[i]| 思路
二分答案,查询[L,R]中[p-mid,p+mid]的数的个数
可以用主席树/归并树维护区间x,y之间数的个数(题解说还可以用线段树)
主席树O(mlog1e6logn) 归并树O(mlog1e6logn^2)  归并树:https://www.cnblogs.com/bennettz/p/8342242.html

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int T,n,m;
int a[N],t[20][N];
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
void build(int s,int l,int r)
{if (l==r){t[s][l]=a[l];return;}int mid=(l+r)>>1;build(s+1,l,mid); build(s+1,mid+1,r);for (int i=l,j=mid+1,k=l;i<=mid||j<=r;){if (j>r) t[s][k++]=t[s+1][i++];else if (i>mid || t[s+1][i]>t[s+1][j]) t[s][k++]=t[s+1][j++];else t[s][k++]=t[s+1][i++];}
}
int query(int s,int l,int r,int L,int R,int x,int y)
{if (x>y ) return 0;if (L<=l&r<=R){//printf("x=%d,y=%d,l=%d,r=%d,>y=%d,>=x=%d\n",x,y,l,r,upper_bound(t[s]+l,t[s]+r+1,y),upper_bound(t[s]+l,t[s]+r+1,x));return upper_bound(t[s]+l,t[s]+r+1,y)-lower_bound(t[s]+l,t[s]+r+1,x);}int mid=(l+r)>>1,ans=0;if (L<=mid) ans+=query(s+1,l,mid,L,R,x,y);if (R>mid) ans+=query(s+1,mid+1,r,L,R,x,y);return ans;
}
int main()
{// freopen("14162.in","r",stdin);// freopen("1.out","w",stdout);T=read();while(T--){n=read(); m=read();//memset(t,0,sizeof(t));for (int i=1;i<=n;i++) a[i]=read();build(0,1,n);int ans=0;int L,R,p,k;while (m--){L=read(); R=read(); p=read(); k=read();L^=ans; R^=ans; p^=ans; k^=ans;int l=0,r=1000005;while (l<=r){int mid=(l+r)>>1;//cout<<mid<<endl;if (query(0,1,n,L,R,p-mid,p+mid)>=k) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans);}}// fclose(stdin);// fclose(stdout);return 0;
}

归并树

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int ls[N*21],rs[N*21],s[N*21],root[N];
int a[N],b[N];
int T,n,m,sz;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
void Insert(int l,int r,int x,int &y,int v)
{y=++sz;s[y]=s[x]+1;if (l==r) return;ls[y]=ls[x]; rs[y]=rs[x];int mid=(l+r)>>1;if (v<=mid) Insert(l,mid,ls[x],ls[y],v);else Insert(mid+1,r,rs[x],rs[y],v);
}
int query(int l,int r,int L,int R,int x,int y)
{if (L<=l&&r<=R) return s[y]-s[x];int ret=0;int mid=(l+r)>>1;if (L<=mid) ret+=query(l,mid,L,R,ls[x],ls[y]);if (R>mid) ret+=query(mid+1,r,L,R,rs[x],rs[y]);return ret;
}int main()
{T=read();while(T--){sz=0;n=read(); m=read();for (int i=1;i<=n;i++) a[i]=read(),b[i]=a[i];sort(b+1,b+1+n);int cnt=unique(b+1,b+1+n)-b-1;for (int i=1;i<=n;i++){a[i]=lower_bound(b+1,b+1+cnt,a[i])-b+1;Insert(1,N,root[i-1],root[i],a[i]);}int ans=0;int L,R,p,k;while (m--){L=read(); R=read(); p=read(); k=read();L^=ans,R^=ans,p^=ans,k^=ans;int l=0,r=1000006;while (l<=r){int mid=(l+r)>>1;int ll=lower_bound(b+1,b+1+cnt,p-mid)-b+1;int rr=upper_bound(b+1,b+1+cnt,p+mid)-b;if (query(1,N,ll,rr,root[L-1],root[R])>=k) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans);}}return 0;
}

主席树

 

转载于:https://www.cnblogs.com/tetew/p/11286580.html

杭电多校第四场-H- K-th Closest Distance相关推荐

  1. 20190731杭电多校第四场

    1001 AND Minimum Spanning Tree(Solved By jlz/cys) 贪心. 对于每个数,找二进制形式下末尾连续1的数量,若为i,则可连到数字2^(i-1),若2^(i- ...

  2. 2019杭电多校 第七场 Kejin Player 6656(求期望值)

    2019杭电多校 第七场 Kejin Player 6656(求期望值) 题目 http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意 给你n,q.表示有n ...

  3. 2022杭电多校(四)

    2022杭电多校(四) 文章目录 2022杭电多校(四) 一.比赛小结 二.题目分析及解法(基础题) 1001.Link with Bracket Sequence II 1002.Link with ...

  4. 杭电多校第六场个人补题6 7 9 10 12

    杭电多校第六场个人补题6 7 9 10 12 6 题意 给定一棵有n结点的树,点权为1~n,求对所有结点子树的mex操作和的最大值 思路 其实就是从最底部开始网上找,由于0是唯一的一个,所欲最好给在最 ...

  5. 2022杭电多校第八场题解

    2022杭电多校第八场 Theramore(思维) 题意 给定一个01字符串,每次可以将一个奇数长度的区间翻转,求操作后字典序最小的字符串. 分析 翻转奇数长度的区间,元素位置的奇偶性不变,统计奇数位 ...

  6. 杭电多校第七场 1011 Kejin Player HDU(6656)

    杭电多校第七场 1011 Kejin Player 题意:给你N行,代表从i级有花费a[i]元的r[i]/s[i]的概率达到i+1级,剩下的概率中可能会到达x[i]级.然后询问从L级到R级的花费会是多 ...

  7. 2019杭电多校第9场1002 Rikka with Cake HDU6681

    2019杭电多校第9场1002 Rikka with Cake HDU6681 题意:给你若干个点按上下左右切割平面,最后问平面内有几块被切割开来. 解法1:红黑树+思维+贪心 A:根据欧拉定理可以得 ...

  8. 2019.7.29 杭电多校第三场小结

    index > 杭电多校第三场 题号 标题 AC 做法 状态 6603 Azshara's deep sea (51/150)34.00% 6604 Blow up the city (213/ ...

  9. 2021杭电多校第八场补题

    比赛传送门:Contest Problem List (hdu.edu.cn) 1006)GCD Game 题目翻译:爱丽丝和鲍勃正在玩游戏. 他们轮流操作.有n个数字,a1,a2,...,an.每次 ...

最新文章

  1. asp.net程序性能优化的七个方面
  2. QIIME 2教程. 25可用和开发中插件AvailableFuturePlugins(2020.11)
  3. 《调色师手册:电影和视频调色专业技法(第2版)》——调色师该何时介入?...
  4. Purism 宣布推出 PureOS 应用商店
  5. 【错误记录】前台进程报错 ( Bad notification for startForeground invalid channel for service notification )
  6. WSDL SOAP 绑定
  7. [SOJ] 畅通工程续
  8. LeetCode 385. 迷你语法分析器(栈)
  9. 二叉树经典题之将二叉树分层打印
  10. wincc与第三方软件opc通讯_OPC 通讯不得不说的强大软件
  11. 设置 cell点击 背景色
  12. oracle的partition,ORACLE PARTITION简介
  13. drivers/mfd/Mfd-core.c
  14. ubuntu下从软件中心安装软件时的软件缓存目录
  15. R 计算时间序列自相关性教程
  16. Java 使用谷歌翻译免费api,翻译文档
  17. 如何查看网卡带宽是千兆还是百兆
  18. Complex-Valued CNN and Its Application in Polarimetric SAR Image Classification
  19. 常用的电平转换方案(74HC245、74LVC4245等)
  20. Android主题切换功能

热门文章

  1. H5新增的标签以及属性
  2. 洛谷 [P2590] 树的统计
  3. 接口测试入门软件及使用注意事项
  4. 顺序队列的表示和实现
  5. 【安卓开发】Layout Inflation不能这么用
  6. Knockout.js 学习 (六)-- 监控属性数组 applyBinding Observables
  7. C++ 虚析构函数
  8. java 网站转app_java – 将现有Web应用程序转换为桌面应用程序
  9. java实现qq_java实现的类似qq聊天系统
  10. 星之卡比镜之迷宫机器人_迷宫武器盘点 | 是兄弟,就拿大宝剑砍我!