K-th Closest Distance

主席树第二波~

题意

给你\(n\)个数\(m\)个询问,问\(i\in [l,r]\)计算每一个\(|a_{i}-p|\)求出第\(k\)小

题目要求强制在线\(l = l \oplus ans、r = r \oplus ans、p = p \oplus ans、k = k \oplus ans\)(ans为上次询问的答案)

思路

  • 二分答案\(ans\),找区间\(i\in[l,r], a_{i} \in [p-ans, p+ans]\)里的数量\(>= k\)

    \(|a_{i} - p | = ans\)

    \(a_{i} - p = ans、p - a_{i} = ans\)

    \(a_{i} = ans + p、a_{i} = p - ans\)
  • 用主席树维护一下就\(ok\)了

AC代码


#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pii pair<int, int> typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 1e5 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m;
int cas, tol, T;
struct Node{
int l, r, cnt;
}node[maxn*40];
int w[maxn], a[maxn];
vector<int> v; void init(){
v.clear();
tol = 0;
mes(w, 0);
} void build(int l, int r, int rt){
rt = ++tol;
node[rt].cnt = 0;
if(l == r)
return;
int mid = l+r>>1;
build(l, mid, node[rt].l);
build(mid+1, r, node[rt].r);
} void update(int l, int r, int &x, int y, int pos){
x = ++tol;
node[x] = node[y];
node[x].cnt++;
if(l == r)
return;
int mid = l+r>>1;
if(pos <= mid)
update(l, mid, node[x].l, node[y].l, pos);
else
update(mid+1, r, node[x].r, node[y].r, pos);
} int query(int L, int R, int l, int r, int x, int y){
if(L <= l && r <= R)
return node[y].cnt - node[x].cnt;
int mid = l+r>>1, ans = 0;
if(L <= mid)
ans += query(L, R, l, mid, node[x].l, node[y].l);
if(R > mid)
ans += query(L, R, mid+1, r, node[x].r, node[y].r);
return ans;
} int getid(int x){
return lower_bound(v.begin(), v.end(), x) - v.begin()+1;
}
int getid_(int x){
return upper_bound(v.begin(), v.end(), x) - v.begin()+1;
} int main() {
scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &m);
init();
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
v.push_back(a[i]);
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
int len = v.size()+1;
build(1, len, 1);
for(int i = 1; i <= n; i++)
update(1, n, w[i], w[i-1], getid(a[i]));
int ans = 0;
while(m--){
int L, R, p, k;
scanf("%d%d%d%d", &L, &R, &p, &k);
L ^= ans; R ^= ans; p^= ans;k ^= ans; //要记得^
int l = 0, r = 1e6;
while(l <= r){
int mid = (l+r)>>1;
int sum = query(getid(p-mid), getid_(p+mid)-1, 1, n, w[L-1], w[R]); //第一个getid和第二个不一样
if(sum >= k){
ans = mid;
r = mid-1;
}
else
l = mid+1;
}
printf("%d\n", ans);
}
}
return 0;
}

HDU - 6621 K-th Closest Distance 主席树+二分答案的更多相关文章

  1. HDU 6521 K-th Closest Distance (主席树+二分)

    题意: 给你一个数组,q次询问,每次问你[l,r]范围内与p距离第k大的元素的与p的距离,强制在线 思路: 主席树提取出[l,r]内的权值线段树,然后二分与p的距离mid ask该权值线段树里[p-m ...

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

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

  3. BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)

    BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...

  4. BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案

    题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...

  5. 【bzoj2653】【middle】【主席树+二分答案】

    Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...

  6. P4094 [HEOI2016/TJOI2016]字符串 后缀数组+主席树+二分答案

    $ \color{#0066ff}{ 题目描述 }$ 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须 ...

  7. BZOJ 4556 [Tjoi2016&Heoi2016]字符串 ——后缀数组 ST表 主席树 二分答案

    Solution 1: 后缀数组暴力大法好 #include <map> #include <cmath> #include <queue> #include &l ...

  8. BZOJ 2653: middle(主席树+二分答案)

    传送门 解题思路 首先可以想到一种暴力做法,就是询问时二分,然后大于等于这个值的设为1,否则设为-1,然后就和GSS1那样统计答案.但是发现这样时间空间复杂度都很爆炸,所以考虑预处理,可以用主席树来做 ...

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

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

随机推荐

  1. MYSQL数据库中的查询语句

    查询的方法 *简单查询:select * from 表名 (* = 所有的) *读取特定列:select 字段一,字段二 from 表名 *条件查询:select * from 表名 where (多 ...

  2. JVisualVM 模拟一次内存泄漏场景分析

    首先贴一段内存泄漏的代码并且执行.(内存泄漏:GC回收不掉的实例对象) package com.example.demo.memoryLeakDemo; import com.example.demo ...

  3. Oracle-创建索引分区

    对大数据量索引进行分区同样能够优化应用系统的性能.一般来说,如果索引所对应的表的数据量非常大,比如几百万甚至上千万条数据,则索引也会占用很大的空间,这时,建议对索引进行分区. Oracle索引分区分为 ...

  4. iframe的基础应用

    点击top.html里面的按钮,刷新left.html右边的内容 <a href="left.html?id=11111&k=5&b=4"  target=& ...

  5. grpc应用于微服务的分析,基于python

    grpc应用于微服务的分析 gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,目前提供 C.Java 和 Go 语言版本,分别是:grpc, grpc-java, g ...

  6. 笨方法学Python 错误记录

    ex8:忘记输入“空格”ex9:忘记输入“冒号”ex14:%前后要空格,否则errorex21:多个函数嵌套,漏写括号)ex24:%d,漏写d,导致程序错误:"""之间的 ...

  7. Python入门习题2.蟒蛇绘制(turtle库)

    例2.调用turtle库中的若干函数来绘制蟒蛇,要求:(1)主体窗口宽650像素,高度350像素,窗口左侧与屏幕左侧像素距离200,窗口顶部与屏幕顶部像素距离200:(2)画笔落点在原点反向前进250 ...

  8. Codeforces 1172B(组合数学)

    题面 给出一棵n个点的树,要求把它画在圆上,且边不相交,画法与排列一一对应(即旋转后相同的算不同种),求方案数.如下图是4个点的树\(T:V=\{1,2,3,4\},E=\{(1,2),(1,3),( ...

  9. 2019 Multi-University Training Contest 1 - 1011 - Function - 数论

    http://acm.hdu.edu.cn/showproblem.php?pid=6588 新学到了一个求n以内与m的gcd的和的快速求法.也就是下面的S1. ①求: $ \sum\limits_{ ...

  10. 我心中的ASP.NET Core 新核心对象WebHost(二)

    这是ASP.NET Core新核心对象系列的第二篇,上一篇 WebHost准备阶段 我们讲到了WebHostBuilder的初始化及配置.我们给WebHostBuilder进行以下配置 UseKest ...