【题目描述】

HDU - 6621 K-th Closest Distance

【题目分析】
因为看到第kkk大的要求,刚开始的时候一直都在想怎么运用第kkk大来解决问题,但是后来看其他人的博客才发现并不需要用第k大,但是主席树维护权值线段树还是需要的,这样可以方便的求出某一区间内数的个数。题目要求的∣q−ai∣|q-ai|∣q−ai∣中第kkk大的,我们可以尝试使用二分,只不过需要进行转化。
我们对绝对值进行二分,左区间为0,右区间为最大的数值106,对于每一个midmidmid,我们查找∣q−ai∣&lt;=mid|q-ai|&lt;=mid∣q−ai∣<=mid的数字有没有kkk个,有kkk个就减少(r=mid−1r=mid-1r=mid−1),否则就增加(l=mid+1l=mid+1l=mid+1)
现在问题的关键在于如何找∣q−ai∣&lt;=mid|q-ai|&lt;=mid∣q−ai∣<=mid的数字有没有kkk个,我们可以对这个式子进行简单的变形,去点绝对值,就能得到ai的范围为q−mid到q+midq-mid到 q+midq−mid到q+mid,即查找符合q−mid到q+midq-mid到q+midq−mid到q+mid的ai有没有kkk个,用一个记录权值的主席树进行维护就能很简单的得到。
【AC代码】

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int MAXN=1e5+10;
const int INF=1e6;
struct node
{int ls,rs;int sum;
}tree[MAXN*40];
int root[MAXN];
int tot;
int n,m;
int ans;void Insert(int &k,int l,int r,int x)
{tot++; tree[tot]=tree[k]; k=tot;tree[k].sum++;if(l==r){return;}int mid=(l+r)>>1;if(x<=mid) Insert(tree[k].ls,l,mid,x);else Insert(tree[k].rs,mid+1,r,x);
}int Query(int now,int pre,int l,int r,int L,int R)
{if(l>=L && r<=R){return tree[now].sum-tree[pre].sum;}int mid=(l+r)>>1;int ret=0;if(L<=mid) ret+=Query(tree[now].ls,tree[pre].ls,l,mid,L,R);if(R>mid) ret+=Query(tree[now].rs,tree[pre].rs,mid+1,r,L,R);return ret;
}int Search(int L,int R,int p,int k)
{int l=0,r=INF,mid,ret;while(l<=r){mid=(l+r)>>1;if(Query(root[R],root[L-1],1,INF,max(p-mid,1),min(p+mid,INF))>=k){ret=mid;r=mid-1;}else{l=mid+1;}}return ret;
}int main()
{int T,x,L,R,p,k;scanf("%d",&T);while(T--){tot=root[0]=tree[0].sum=tree[0].rs=tree[0].ls=0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&x);root[i]=root[i-1];Insert(root[i],1,INF,x);}ans=0;for(int i=0;i<m;i++){scanf("%d%d%d%d",&L,&R,&p,&k);L=L^ans; R=R^ans; p=p^ans; k=k^ans;//if(L>R) swap(L,R);ans=Search(L,R,p,k);//这里一定要记得对ans进行赋值,忘记赋值找了好久。多组数据一定要手动检查一下,很容易出错printf("%d\n",ans);}}return 0;
}

HDU - 6621 K-th Closest Distance——主席树+二分相关推荐

  1. HDU4417 Super Mario(离线树状数组或者主席树+二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. K-th Closest Distance HDU - 6621(第k小绝对值+主席树+二分)

    You have an array: a1, a2, , an and you must answer for some queries. For each query, you are given ...

  3. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

  4. HDU - 6278 Just $h$-index主席树+二分

    HDU - 6278 Just hhh-index [题目描述] [题目分析] 题目要求在区间[l,r][l,r][l,r]内大于h的数不少于h个,对于这种最大化问题,我们应该想到二分. 最小情况显然 ...

  5. HDU - 6704 K-th occurrence (后缀数组+主席树)

    题目链接 题意 QQQ次询问,每次询问求SSS的子串出现KKK次的位置 思路 刚开始想的是AC自动机,但是建自动机会超时,后来学长想到后缀数组+主席树的做法Orz...Orz...Orz... 出现K ...

  6. COGS 930. [河南省队2012] 找第k小的数 主席树

    主席树裸板子 #include<cstdio> #include<iostream> #include<algorithm> #define MAXN 100005 ...

  7. HDU - 3804 Query on a tree(主席树维护最大值+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  8. BZOJ4504. K个串(主席树+优先队列)

    4504. K个串 description solution code description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串 ...

  9. #HDU 4417 Super Mario (主席树 + 二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

最新文章

  1. error C3872: '0x3000': this character is not allowed in an identifier 解决方法
  2. ASP.NET MVC 自定义模型绑定1 - 自动把以英文逗号分隔的 ID 字符串绑定成 Listint...
  3. 2011年全国大学生程序设计邀请赛(福州)
  4. ssm项目的maven-pom.xml
  5. HDU 3551 Hard Problem
  6. Normal Equation----machine learning
  7. STP是一个需要众力协作的协议
  8. 基于51单片机的循迹小车
  9. 散射理论对微波遥感的重要性
  10. Django前端使用ECharts完成数据可视化
  11. DPM learn.cc编译
  12. 详解比较好的音视频通话SDK开发包的技术要点
  13. Python----数据分析-使用scikit-learn构建模型实训(wine数据集、wine_quality数据)
  14. 【python】python爬虫requests库详解
  15. 优教信使同步辅学总是显示服务器,优教信使同步学习卡在教学中的应用论文
  16. 为什么我们需要TOGAF企业架构?——上海信息化培训中心
  17. airpods二代降噪吗_华强北 苹果二代三代 蓝牙耳机airpods。不跳电,真降噪。
  18. P2564 [SCOI2009]生日礼物(尺取法/双指针)
  19. 用C语言实现贪吃蛇笔记1-------.wav格式音乐的添加及播放(方法一:嵌入到可执行文件里面)
  20. E5 调用API续订服务:Microsoft 365 E5 Renew Web

热门文章

  1. 课后作业-阅读任务-阅读笔记-2
  2. [ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!
  3. 福昕熊雨前:PDFium开源项目的背后
  4. 2014-08-26 遇到的小问题
  5. easyui plugin——etreegrid:CRUD Treegrid
  6. HadoopSourceAnalyse --- Nodemanager Container request handler
  7. IOS中设置全局变量
  8. 科学计算机二进制算法,计算机是怎么理解二进制的?
  9. vue 启动时卡死_十分钟浅入Vue 原理
  10. Java防止Xss注入json_每日一题(java篇) 如何防止xss注入