2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)
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;
}
2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)的更多相关文章
- [2019杭电多校第四场][hdu6621]K-th Closest Distance(主席树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6621 题意为求区间[l,r]内第k小|a[i]-p|的值. 可以二分答案,如果二分的值为x,则判断区间 ...
- [2019杭电多校第四场][hdu6623]Minimal Power of Prime
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6623 题目大意为求一个数的唯一分解的最小幂次.即120=23*31*51则答案为1. 因为数字太大不能 ...
- [2019杭电多校第四场][hdu6616]Divide the Stones
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6616 题意是说n个数分别为1-n,将n个数分成k堆,能否满足每堆个数相等,数值之和相等.保证n%k=0 ...
- [2019杭电多校第四场][hdu6614]AND Minimum Spanning Tree(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6614 题目大意是有一张n个点的完全图,n个点点权为1-n,边权为两点点权按位与(&).求最小生 ...
- 2019杭电多校第四场hdu6623 Minimal Power of Prime
Minimal Power of Prime 题目传送门 解题思路 先打\(N^\frac{1}{5}\)内的素数表,对于每一个n,先分解\(N^\frac{1}{5}\)范围内的素数,分解完后n变为 ...
- 杭电多校第四场 Problem K. Expression in Memories 思维模拟
Problem K. Expression in Memories Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262 ...
- 杭电多校第四场 E Matrix from Arrays
Problem E. Matrix from Arrays Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 ...
- 2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望
题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...
- 2019 杭电多校第八场 HDU - 6665 Calabash and Landlord 两矩形分平面
题意 给出两个矩形,问这两个矩形把平面分成了几部分. 分析 不需要什么高级技能,只需 “简单” 的分类讨论. (实在太难写了,对拍找出错误都不想改 推荐博客,其中有个很好的思路,即只讨论答案为2,3, ...
随机推荐
- python selenium 自动化流程的一些总结与思考
首先要考虑的项目为什么要做自动化测试?(主要从自动化测试的优点着手) 其次是什么项目才适合做自动化测试? 自动化测试覆盖率要达到什么样的程度?因为都知道不可能达到100%的,不然脚本太臃肿,反而会失去 ...
- C++之前置自增与后置自增
关于前置自增与后置自增的区别我是参考这里:http://bbs.bccn.net/thread-454977-1-1.html 简单复述下,比如++x; 与 x++; 在C中,++x这个表达式的值为原 ...
- java.lang.IllegalAccessException: Class XXXcan not access xxx with modifiers "private"
field 或者 method 是 provate的 field.setAccessible(true); method.setAccessible(true); 有时候是因为 newinstance ...
- PAT_A1131#Subway Map
Source: PAT A1131 Subway Map (30 分) Description: In the big cities, the subway systems always look s ...
- yum常见问题
--> Finished Dependency Resolution Error: Multilib version problems found. This often means that ...
- ARC080E
倒着考虑 每次拿出的第一个必须是奇数位置,第二个必须是偶数位置.每次删数都不能跨过已被删去的位置. 事实上只要开个堆维护一下区间就行了.但是众所周知我zz,所以我写的线段树 #include<i ...
- 实习记——《Rethink》
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gmszone/article/details/30045055 最终能够在和自己的电脑上写下这些字了 ...
- teb教程3
配置和运行机器人导航 简介:配置teb_local_planner作为navigation中local planner的插件 参考teb安装 由于局部代价地图的大小和分辨率对优化性能影响很大,因为占据 ...
- codeforces1213F Unstable String Sort 思维
题目传送门 题意:a和b都代表字符串的下标,至少用k个字符,构造一个长度为n的字符串,将这个字符串中的字符按无论是按$a$写还是按$b$写,字典序都非递减. 思路:如果将$a[l,r]=b[l,r]$ ...
- linux中的read_link
readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置. readlink 获取当前进程对应proc/self/exe]:shell中 readlink /proc/sel ...