POJ2104 K-th Number(线段树,二分,vector)
题意
不带修改区间第k小。(n<=100000)
题解
建立线段数和vector数组(vector为当前区间排列之后的序列)(归并)
然后对于每一个询问二分答案。
问题就转化为区间有多少数小于等于二分值。
对于我们每一个遍历的区间(线段数的节点)。
若与询问区间不相交return0。
若完全包含于询问区间则在此区间的vector上二分查找有多少数小于二分值(因为已经排好序,所以很好做)
若有相交部分则继续遍历子树。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=;
vector<int> d[N*];
struct tree{
int l,r;
}tr[N*];
const int INF=;
int a[N*];
int n,m;
void build(int l,int r,int now){
tr[now].l=l;tr[now].r=r;
if(l==r){
d[now].push_back(-INF);
d[now].push_back(a[l]);
return;
}
int mid=(l+r)>>;
build(l,mid,now*);
build(mid+,r,now*+);
int size1=d[now*].size()-;
int size2=d[now*+].size()-;
int i=,j=;
d[now].push_back(-INF);
while(i<=size1&&j<=size2){
if(d[now*][i]>d[now*+][j])d[now].push_back(d[now*+][j++]);
else d[now].push_back(d[now*][i++]);
}
while(i<=size1)d[now].push_back(d[now*][i++]);
while(j<=size2)d[now].push_back(d[now*+][j++]);
return;
}
int getnum(int now,int K){
int x=;int y=d[now].size()-;
int tmp=;
while(x<=y){
int mid=(x+y)>>;
// cout<<x<<" "<<y<<endl;
if(d[now][mid]<=K){
tmp=mid;
x=mid+;
}
else y=mid-;
}
return tmp;
}
int check(int l,int r,int now,int K){
// cout<<l<<" "<<r<<endl;
if(tr[now].l>r||tr[now].r<l)return ;
if(l<=tr[now].l&&tr[now].r<=r){
// cout<<l<<" "<<r<<" "<<getnum(now,K)<<endl;
return getnum(now,K);
}
int mid=(tr[now].l+tr[now].r)>>;
int tmp1=check(l,r,now*,K);
int tmp2=check(l,r,now*+,K);
return tmp1+tmp2;
}
int search(int l,int r,int k){
int tmp;
int x=-INF;
int y=INF;
while(x<=y){
int mid=(x+y)>>;
int num=check(l,r,,mid);
// cout<<mid<<" "<<num<<endl;
if(num>=k){
tmp=mid;
y=mid-;
}
else x=mid+;
}
return tmp;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
build(,n,);
for(int i=;i<=m;i++){
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
int ans=search(l,r,k);
printf("%d\n",ans);
}
return ;
}
POJ2104 K-th Number(线段树,二分,vector)的更多相关文章
- hdu4614 线段树+二分 插花
Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...
- BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)
我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...
- 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- luogu4422 [COCI2017-2018#1] Deda[线段树二分]
讨论帖:线段树二分的题..我还考场切过..白学 这题我一年前的模拟赛考场还切过,现在就不会了..好菜啊. 显然直接线段树拆成$\log n$个区间,然后每个区间在进行线段树二分即可. UPD:复杂度分 ...
- bzoj4399 魔法少女LJJ 线段树合并+线段树二分+并查集
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4399 题解 毒瘤题 \(9\) 种操作还有支持动态图的连通性 仔细读题 $ c<=7$. ...
- 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)
2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
随机推荐
- zookeeper客户端命令行操作
一.命令行 (1)使用zookeeper安装bin目录下的./zkCli.sh连接到zookeeper服务器上,基本语法如下: ./zkCli.sh -timeout 0 -r -server ip: ...
- Oracle查询当前用户下的所有表及sqlplus 设置 列宽
如果oracle服务器中装有多个数据库实例,则在用户名处输入:用户名/密码@数据库名称.如果数据库服务器不在本机上,还需要加上数据库服务器的地址:用户名/密码@IP地址/数据库名称. [oracle@ ...
- SpringBoot学习笔记(12)----SpringBoot实现多个 账号轮询发送邮件
首先,引入发送邮件的依赖,由于freemarker自定义模板,所以也需要把freemarker的依赖引入 pom.xml文件 <dependency> <groupId>org ...
- ListNode的python 实现
class Node(object): def __init__(self): self.val = None self.next = None class Node_handle(): def __ ...
- while循环,格式化输出%,运算符,数据类型的转换,编码的初识,
1.内容总览 while循环 格式化输出 运算符 and or not 编码的初识 2. 具体内容 while 循环 where:程序中:你需要重复之前的动作,输入用户名密码时,考虑到while循环. ...
- RegExp javascript正则表达式 :
传统的查找字符串中的相关的字符 :<script type="text/javascript">var str='aaa23uihjkikh666jhjhk888kuh ...
- root of factory hierarchy
项目编译错误! project---->clean
- MySQL 高可用:mysql+mycat实现数据库分片(分库分表)
本文引用于http://blog.csdn.net/kk185800961/article/details/51147029 MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 什么 ...
- 架构思想之CAP原理
由于自己负责后端的设计已经有一段时间,对设计的一些思想和理论有一些理解,但最近被问到什么是CAP时,却一脸懵逼,下来后专门针对CAP架构思想进行了一些专题学习,在这里也将这个概念引入给大家,大家可以有 ...
- APK反编译去广告大揭秘
APK反编译去广告 具体步骤: 1.下载 apktool 下载地址:https://code.google.com/p/android-apktool/downloads/list 2.通过apkto ...