HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6621

题意:

给你n个数,有m次询问

每次问你在区间[l,r]内 第k小的|\(a_i-p\)|是多少

题解:

主席树+二分

每次二分答案

如果p+mid到p-mid的值的个数大于k个的话,mid值就是可行了,然后缩小区间往左找即可

因为保证有解,所以二分出来的mid值就是答案了

query查的是权值在区间[p-mid,p+mid]内数的个数

主席树的sum就是用来统计权值个数的

注意不要被k给坑了,枚举第k小的数会T到爆的(QAQ)

AC单组复杂度分析 :1e5*log(1e6)*log(1e6);

TLE单组复杂度分析:1e5*169*2*log(1e6);

代码:

#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define bug printf("*********\n")
#define FIN freopen("input.txt","r",stdin);
#define FON freopen("output.txt","w+",stdout);
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"
#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"
#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<<z<<"]\n"
const int maxn = 3e5 + 5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double Pi = acos(-1);
LL gcd(LL a, LL b) {
return b ? gcd(b, a % b) : a;
}
LL lcm(LL a, LL b) {
return a / gcd(a, b) * b;
}
double dpow(double a, LL b) {
double ans = 1.0;
while(b) {
if(b % 2)ans = ans * a;
a = a * a;
b /= 2;
} return ans;
}
LL quick_pow(LL x, LL y) {
LL ans = 1;
while(y) {
if(y & 1) {
ans = ans * x % mod;
} x = x * x % mod;
y >>= 1;
} return ans;
}
struct Tree {
int l, r, sum;
} T[maxn * 40];
int cnt, n, m;
int a[maxn];
int root[maxn];
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) >> 1;
if(pos <= mid) 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 k) {
if(k==0) return 0;
if(l == r) return T[y].sum - T[x].sum;
int mid = (l + r) >> 1;
if (k <= mid)return query(l, mid, T[x].l, T[y].l, k);
else {
int ans = query(mid + 1, r, T[x].r, T[y].r, k);
ans += T[T[y].l].sum - T[T[x].l].sum;
return ans;
}
}
int main() { int T;
scanf("%d", &T);
while(T--) {
cnt = 0;
scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
int N = 1000000;
for(int i = 1; i <= n; i++) {
update(1, N, root[i], root[i - 1], a[i]);
}
int x, y, p, k;
int ans = 0;
for(int i = 1; i <= m; i++) {
scanf("%d%d%d%d", &x, &y, &p, &k);
x ^= ans;
y ^= ans;
if(x > y) swap(x, y);
p ^= ans;
k ^= ans;
int l = 0, r = N;
while(l <= r) {
int mid = (l + r) >> 1;
int R = min(N, p + mid);
int L = max(0, p - mid - 1);
if(query(1, N, root[x - 1], root[y], R) -
query(1, N, root[x - 1], root[y], L) >= k) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
/*
while (L <= R) {
mid = (L + R) >> 1;
if (query(1, N, root[l - 1], root[r], min(p + mid, N)) -
query(1, N, root[l - 1], root[r], max(p - mid - 1, 0)) >= k)
ans = mid, R = mid - 1;
else L = mid + 1;
}*/
printf("%d\n", ans);
}
}
return 0;
}

HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)的更多相关文章

  1. 2019牛客网暑假多校训练第四场 K —number

    链接:https://ac.nowcoder.com/acm/contest/884/K来源:牛客网 题目描述 300iq loves numbers who are multiple of 300. ...

  2. 2019牛客多校训练第四场K.number(思维)

    题目传送门 题意: 输入一个只包含数字的字符串,求出是300的倍数的子串的个数(不同位置的0.00.000等都算,并考虑前导零的情况). sample input: 600 1230003210132 ...

  3. HDU 4639 hehe 杭电2013多校联赛第四场1008题

    解题报告:题目的意思是输入一个字符串,并规定,里面的“hehe”可以用"wqnmlgb"来代替,也可以不代替,问输入的这个字符串在经过相关的代替之后可以有多少种不同的形态.先打一个 ...

  4. 牛客网多校训练第四场C sequence

    (牛客场场有笛卡尔树,场场都不会用笛卡尔树...自闭,补题心得) 题目链接:https://ac.nowcoder.com/acm/contest/884/C 题意:给出两个序列a,b,求max{mi ...

  5. POJ 6621: K-th Closest Distance(主席树 + 二分)

    K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others)    Memory Limit: 524288/524288 K (Jav ...

  6. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  7. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  8. HDU6579 2019HDU多校训练赛第一场1002 (线性基)

    HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...

  9. 2019HDU多校第四场 K-th Closest Distance ——主席树&&二分

    题意 给定 $n$ 个数,接下来有 $q$ 次询问,每个询问的 $l, r, p, k$ 要异或上一次的答案,才是真正的值(也就是强制在线).每次询问,输出 $[l, r]$ 内第 $k$ 小的 $| ...

随机推荐

  1. PHP如何输出合并单元格的表

    https://mp.weixin.qq.com/s/ChPIKIv9tqmuqGyfc9Zi7Q 合并单元格的表,很多地方可以见到,比如购物车,订单合并等,今天给大家讲解一下,如何操作,虽然我用的l ...

  2. ELK练习

    1.ELK练习 PUT s3/_doc/ { "mappings" : { "doc" : { "properties" : { " ...

  3. 如何将英文PDF文献翻译成中文

    方法一:利用Google的本地文档翻译功能 这种方法比较简单,打开Google翻译首页http://translate.google.cn/, 选择"上传文档" 选择文件,开始翻译 ...

  4. Spring security获取当前用户

    1.如果在jsp页面中获取可以使用spring security的标签 页面引入标签 <%@ taglib prefix="sec" uri="http://www ...

  5. 类的重载case2

    /*功能:类的成员属性和成员方法*/ public class Person{    public static void main(String args[]){        TruePerson ...

  6. Python 常量

  7. oralce GROUPING SETS

    select id,area,stu_type,sum(score) score from students group by grouping sets((id,area,stu_type),(id ...

  8. Linux下的一些配置

    /etc/vim/vimrc文件 set cindent set expandtab set smartindent set autoindent set nu set hls taglist安装(t ...

  9. cp拷贝

    1 cp 拷贝.复制 NAME cp - copy files and directories SYNOPSIS cp [OPTION]... [-T] SOURCE DEST        -- c ...

  10. python起个简单web服务器

    在 Linux 服务器上或安装了 Python 的机器上,Python自带了一个WEB服务器 SimpleHTTPServer. 我们可以很简单的使用  python -m SimpleHTTPSer ...