K-th Closest Distance

题目传送门

解题思路

二分答案+主席树

先建主席树,然后二分答案mid,在l和r的区间内查询[p-mid, p+mid]的范围内的数的个数,如果大于k则说明这个范围内存在第k小的数,r=mid,否则不存在,l=mid+1。

代码如下

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll; inline int read(){
int res = 0, w = 0; char ch = 0;
while(!isdigit(ch)){
w |= ch == '-', ch = getchar();
}
while(isdigit(ch)){
res = (res << 3) + (res << 1) + (ch ^ 48);
ch = getchar();
}
return w ? -res : res;
} const int N = 1000005; int rt[N], cnt;
struct T{
int l, r;
int lch, rch;
int sum;
}tree[N * 30]; inline int build(int l, int r)
{
int p = ++cnt;
tree[p].l = l;
tree[p].r = r;
tree[p].lch = tree[p].rch = tree[p].sum = 0;
if(l == r)
return p;
int mid = (l + r) / 2;
tree[p].lch = build(l, mid);
tree[p].rch = build(mid + 1, r);
return p;
} inline int insert(int k, int x)
{
int p = ++cnt;
tree[p].l = tree[k].l;
tree[p].r = tree[k].r;
tree[p].lch = tree[k].lch;
tree[p].rch = tree[k].rch;
tree[p].sum = tree[k].sum + 1;
if(tree[k].l == tree[k].r)
return p;
int mid = (tree[k].l + tree[k].r) / 2;
if(x <= mid)
tree[p].lch = insert(tree[k].lch, x);
else
tree[p].rch = insert(tree[k].rch, x);
return p;
} int query(int k1, int k2, int l, int r)
{
if(tree[k1].l >= l && tree[k1].r <= r)
return tree[k2].sum - tree[k1].sum;
int mid = (tree[k1].l + tree[k1].r) / 2;
int m1 = 0, m2 = 0;
if(l <= mid)
m1 = query(tree[k1].lch, tree[k2].lch, l, r);
if(r > mid)
m2 = query(tree[k1].rch, tree[k2].rch, l, r);
return m1 + m2;
} int main()
{
int _;
scanf("%d", &_);
while(_ --){
int n, m;
scanf("%d%d", &n, &m);
rt[0] = build(1, 1e6);
for(int i = 1; i <= n; i ++){
int x = read();
rt[i] = insert(rt[i -1], x);
}
int x = 0;
for(int i = 1; i <= m; i ++){
int l, r, p, k;
l = read(), r = read(), p = read(), k = read();
l ^= x, r ^= x, p ^= x, k ^= x;
int ll = 0, rr = 1e6;
int mid = (ll + rr) / 2;
while(ll < rr){
if(query(rt[l - 1], rt[r], max(1, p - mid), min(p + mid, 1000000)) >= k)
rr = mid;
else
ll = mid + 1;
mid = (ll + rr) / 2;
}
x = mid;
printf("%d\n", x);
}
}
return 0;
}

最新文章

  1. 基于vue的新组件开发
  2. .net学习笔记--序列化与反序列化
  3. ADHelper C#域用户操作(转)
  4. Android -- 初探MVP模式
  5. Mysqldump参数大全(转)
  6. bzoj3551 3545
  7. smarty半小时快速上手入门教程
  8. 【JAVA - SSM】之MyBatis插入数据后获取自增主键
  9. Mysql操作命令出现错误时消除/mysql数据导入txt
  10. sql获取每门课程成绩最好的学生信息
  11. BSA Network Shell系列-通过NSH执行Powershell,VBScript或bat files脚本
  12. 十年磨一剑 Delphi重新崛起再写传奇
  13. TopCoder SRM 561 Div 1 - Problem 1000 Orienteering
  14. ALS交替最小二乘法总结
  15. Proj.Net 投影介绍
  16. Learning-Python【0】:Windows环境下Python2和Python3的安装
  17. Laravel传值总结
  18. HTTP、TCP、IP协议常见面试题
  19. 使用 Scrapyd 管理部署 Scrapy 的一些问题
  20. Java封装概述

热门文章

  1. selenium多表单操作与多窗口,以及警告框处理
  2. send_keys报错element not interactable
  3. leetcode python两整数之和
  4. 开发效率优化之自动化构建系统Gradle(二)下篇
  5. quick&#39;n&#39;dirty poc for CVE-2013-1763 SOCK_DIAG bug in kernel 3.3-3.8
  6. [JXOI2017]数列
  7. 微信小程序の微信js
  8. RK3288编译 Android 5.1 固件
  9. Codeforces 351C Jeff and Brackets 矩阵优化DP
  10. 对malloc与free函数的浅识