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学习笔记:python操作redis
Redis 是一个高性能的key-value数据库.它支持存储的value类型包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈 ...
- activiti7组任务测试
package com.zcc.activiti05; import org.activiti.engine.*;import org.activiti.engine.repository.Deplo ...
- Eureka 系列(08)心跳续约与自动过期
Eureka 系列(08)心跳续约与自动过期 [TOC] Spring Cloud 系列目录 - Eureka 篇 在上一篇 Eureka 系列(07)服务注册与主动下线 中对服务的注册与下线进行了分 ...
- SQL中to_char方法的应用
1.取得当前日期是本月的第几周 SQL> select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual; ----------------- ...
- centors7 和 win7 修改开机顺序
打开/boot/grub2/grub.cfg,找到windows对应的项 我的是 Windows 7 (loader) (on /dev/sda1) 执行命令 grub2-set-default &q ...
- Spring学习笔记(7)——Bean的基本配置
先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就 ...
- 使用PL/SQL连接oracle数据库,并将数据进行导出备份和导入恢复
使用PL/SQL连接oracle数据库,并将数据进行导出备份和导入恢复 这种操作百度一搜一大片,今天整理以前做的项目时自己备份了一下数据库,试着将数据进行导出备份和导入恢复了一下:下面是操作过程: 1 ...
- 2018-8-29-Roslyn-静态分析
title author date CreateTime categories Roslyn 静态分析 lindexi 2018-08-29 09:10:19 +0800 2018-03-13 14: ...
- Leetcode 200.岛屿的数量 - DFS、BFS
Leetcode 200 岛屿的数量: DFS利用函数调用栈保证了检索顺序, BFS则需要自己建立队列,把待检索对象按规则入队. class Solution { // DFS解法,8ms/10.7M ...
- MySQL数据库企业级应用实践(多实例源码编译)
MySQL数据库企业级应用实践(多实例源码编译) 链接:https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码:ekpy 复制这段内容后打开百度网盘手机 ...