HDOJ-6621(线段树+二分法)
K-th Closest Distance
HDOJ-6621
- 本题可以使用线段树解决,结点存本结点对应的所有元素,并按照从小打到排序
- 最后使用二分法求解答案。因为题目中有绝对值,所以需要使用两次查找,再相减和k比较
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
int n,m;
int l,r,p,k;
int l1,r1,p1,k1;
int x=0;
int arr[100005];
vector<int> v[400020];//注意这里的空间开4*n
void build(int node,int l,int r){
v[node].clear();
for(int i=l;i<=r;i++){
v[node].push_back(arr[i]);
}
sort(v[node].begin(),v[node].end());
if(l==r){
return;
}
int mid=(l+r)>>1;
build(node<<1,l,mid);
build(node<<1|1,mid+1,r);
}
int query(int node,int l,int r,int p,int q,int u){
if(p<=l&&q>=r){
vector<int>::iterator it=upper_bound(v[node].begin(),v[node].end(),u);
int cnt=it-v[node].begin();
return cnt;
}
int ans=0;
int mid=(l+r)>>1;
if(p<=mid){
ans+=query(node<<1,l,mid,p,q,u);
}
if(q>mid){
ans+=query(node<<1|1,mid+1,r,p,q,u);
}
return ans;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
x=0;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&arr[i]);
}
build(1,1,n);
int maxs=*max_element(arr+1,arr+1+n);//这里不能卸载right那里,否则超时
for(int i=0;i<m;i++){
scanf("%d%d%d%d",&l1,&r1,&p1,&k1);
l=l1^x;r=r1^x;p=p1^x;k=k1^x;
int left=0,right=maxs;//max_element用来求数组中的一个最大值
while(right>=left){
int mid=(right+left)>>1;
int temp=query(1,1,n,l,r,p+mid)-query(1,1,n,l,r,p-mid-1);
if(temp>=k){
right=mid-1;
}else{
left=mid+1;
}
}
printf("%d\n",left);
x=left;
//cout<<left<<endl;
}
}
//system("pause");
return 0;
}
HDOJ-6621(线段树+二分法)的更多相关文章
- SPOJ Meteors - 可持久化线段树 - 二分法
Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The plan ...
- HDOJ 4417 - Super Mario 线段树or树状数组离线处理..
题意: 同上 题解: 抓着这题作死的搞~~是因为今天练习赛的一道题.SPOJ KQUERY.直到我用最后一种树状数组通过了HDOJ这题后..交SPOJ的才没超时..看排名...时间能排到11名了..有 ...
- hdoj 4325 Flowers 线段树+离散化
hdoj 4325 Flowers 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4325 思路: 直接线段树,按照花的开放区间的大小建树,要注意虽然 ...
- 线段树(单点更新) HDOJ 2795 Billboard
题目传送门 /* 主要利用线段树求区间最值,sum[]代表位置可用空间 每次找到最大值的位置 功能:查询最靠前能容纳广告的位置 */ #include <cstdio> #include ...
- 线段树(单点更新)/树状数组 HDOJ 1166 敌兵布阵
题目传送门 /* 线段树基本功能:区间值的和,修改某个值 */ #include <cstdio> #include <cstring> #define lson l, m, ...
- 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations
题目传送门 /* 题意:不懂... 线段树+树状数组+贪心:贪心从第一位开始枚举,一个数可以是循环节的末尾或者在循环节中,循环节(循环节内部是后面的换到前面,最前面的换到最后面).线段树维护最大值,树 ...
- 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)
题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...
- 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)
题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...
- 线段树(多棵) HDOJ 4288 Coder
题目传送门 题意:集合,add x, del x, 求和 分析:首先,暴力可以过这题.用上线段树能大大降低时间的消耗,具体就是类似开了5棵线段树,每个节点都有5个空间,表示该区间的id%5后的和,区间 ...
随机推荐
- A. Little Elephant and Interval
The Little Elephant very much loves sums on intervals. This time he has a pair of integers l and r ( ...
- docker的企业级仓库-harbor
Harbor 一.背景 Docker中要使用镜像,我们一般都会从本地.Docker Hub公共仓库或者其它第三方的公共仓库中下载镜像,但是出于安全和一些内外网的原因考虑,企业级上不会轻易使用.普通的D ...
- 爬虫入门六 总结 资料 与Scrapy实例-bibibili番剧信息
title: 爬虫入门六 总结 资料 与Scrapy实例-bibibili番剧信息 date: 2020-03-16 20:00:00 categories: python tags: crawler ...
- Spring(三) Spring IOC 初体验
Web IOC 容器初体验 我们还是从大家最熟悉的 DispatcherServlet 开始,我们最先想到的还是 DispatcherServlet 的 init() 方法.我们发现在 Dispath ...
- vue项目webpack打包后修改配置文件
从webpack打包结构中我们知道,vue中有一个存放外部资源的文件夹static,它里面的文件是不会被打包编译的,所以我们就可以利用外部引入js的方式将我们的想要的数据在index.html中以js ...
- sql-libs(6) 双引号的报错注入
payload:http://192.168.48.130/sqli-laaess-6/?id=1" and updatexml(1,concat(0x7e,(SELECT schema_n ...
- ES6 Arrow Function All In One
ES6 Arrow Function All In One this const log = console.log; const arrow_func = (args) => log(`arg ...
- gitignore auto generator
gitignore auto generator .gitignore https://gitignore.io/ https://www.toptal.com/developers/gitignor ...
- H5 广告落地页
H5 广告落地页 Landing Page 用于承接通过付费搜索渠道点击进入的用户,所以叫落地页 什么是登陆页面? 在数字营销中,登录页面是专门为营销或广告活动创建的独立网页. 访问者单击电子邮件中的 ...
- LeetCode & list cycle
LeetCode & list cycle 链表是否存在环检测 singly-linked list 单链表 "use strict"; /** * * @author x ...