题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1175

注意一个很明显的结论:求区间[p,q]的第K大就等于求区间[p,q]的第q-p+1-k小。

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N = 100005;
int sorted[N];
int Tree[20][N];
int toLeft[20][N];
void Build(int k,int l,int r)
{
if(l==r) return;
int mid=(l+r)>>1;
int i,t;
t=mid-l+1;
for(i=l;i<=r;i++)
if(Tree[k][i]<sorted[mid])
t--;
int L=l;
int R=mid+1;
for(i=l;i<=r;i++)
{
if(i==l)
toLeft[k][i]=0;
else
toLeft[k][i]=toLeft[k][i-1];
if(Tree[k][i]<sorted[mid])
{
toLeft[k][i]++;
Tree[k+1][L++]=Tree[k][i];
}
else if(Tree[k][i]>sorted[mid])
{
Tree[k+1][R++]=Tree[k][i];
}
else
{
if(t!=0)
{
t--;
toLeft[k][i]++;
Tree[k+1][L++]=Tree[k][i];
}
else
Tree[k+1][R++]=Tree[k][i];
}
}
Build(k+1,l,mid);
Build(k+1,mid+1,r);
}
int Query(int k,int l,int r,int p,int q,int t)
{
if(p==q) return Tree[k][p];
int s,ss;
int mid=(l+r)>>1;
if(l==p)
{
s=0;
ss=toLeft[k][q];
}
else
{
s=toLeft[k][p-1];
ss=toLeft[k][q]-s;
}
int L,R;
if(t<=ss)
{
L=l+s;
R=l+s+ss-1;
return Query(k+1,l,mid,L,R,t);
}
else
{
L=mid-l+1+p-s;
R=mid-l+1+q-s-ss;
return Query(k+1,mid+1,r,L,R,t-ss);
}
}
int main()
{
int n,m,i,j;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
{
scanf("%d",&Tree[0][i]);
sorted[i]=Tree[0][i];
}
std::sort(sorted+1,sorted+n+1);
Build(0,1,n);
scanf("%d",&m);
int p,q,k;
while(m--)
{
scanf("%d%d%d",&p,&q,&k);
p++;q++;k--;
printf("%d\n",Query(0,1,n,p,q,q-p+1-k));
}
}
return 0;
}

区间第K大(划分树)相关推荐

  1. J - [永不止步-2017]_区间第K大-线段树维护

    J - [永不止步-2017]_区间第K大 把线段树的结点的数据域设置为vector类型即可别的操作为区间更新模板 思路就是这样runtime error暂时没改对 #include<bits/ ...

  2. P2617 Dynamic Rankings 动态区间第K大【树套树】或【整体二分】

    传送门 动态区间第KKK大问题,单点修改(这里是第kkk小,即是从小到大第kkk个) 这里还有个区间修改,有点类似的 P3332 [ZJOI2013]K大数查询 分析 树套树 树套树,就是用一种树形结 ...

  3. HDU2665 求区间第K大 主席树

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2665 代码: //#include<bits/stdc++.h> #include< ...

  4. hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)

    题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...

  5. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

  6. Dynamic Rankings——带修改区间第k大

    三种做法: 1.整体二分: 二分mid 考虑小于mid的修改的影响 但是大于mid的修改可能会干掉小于mid的一些值 所以额外把一个修改变成一个值的删除和一个值的添加 这样就相互独立了! 整体二分,树 ...

  7. poj2104(区间第k大+离散化)

    题意: 给定一个序列,求[a,b]区间第k大的数字. 思路: 主席树模板题,但是注意数据范围,需要离散化. 代码: #include<cstdio> #include<cstring ...

  8. O(n)复杂度求区间第K大

    O(n)复杂度求区间第K大 描述 给你一个数组,O(N)复杂度找出其中第K大的数. 输入 第一行包括两个数,N,K,分别代表数组大小,以及你应该找出第K大的数. 接下来N行,每行包括一个数. ​ 输出 ...

  9. HDU2665(函数式线段树-区间第K大)

    题目:K-th Number 如果求区间第K小,就转换一下就行了,假设你要求区间[u,v]的第k小,那就是第v-u+1-k大 #include<stdio.h> #include<a ...

最新文章

  1. 2022-2028年中国康养旅游行业市场竞争力分析及发展策略分析报告
  2. 【 Vivado 】基本的时序约束、分析的概念
  3. 企业官网页面设计谨记三个要点!
  4. orcale存储过程学习之路(一)
  5. 【数据结构与算法】之面试必考的“二分算法”系统梳理
  6. top进阶命令htop运用
  7. android学习笔记---35_Intent意图,深入解剖
  8. java url转成pdf_java URL转PDF文件
  9. [洛谷P3979]遥远的国度
  10. python列表排序sort_python列表排序方法reverse、sort、sorted
  11. 可编辑ppt地图分布图怎么做?
  12. csdn 问答使用与测评
  13. 遥感图像计算机自动分类原理,第30讲:8.1遥感图像自动识别分类
  14. openGL 中 glColor3f()函数 颜色设定
  15. DQL、DML、DDL、DCL的定义
  16. 适配80mm打印机网页打印自动高度问题
  17. python如何群控手机_python调用adb脚本来实现群控安卓手机初探
  18. asp 复数个oracle链接,asp中的各种数据库连接方法
  19. Java自定义拦截器处理防抖
  20. 应收账款管理存在哪些问题?如何解决

热门文章

  1. 未付服务网关限流作用
  2. 反射_Class对象功能_获取Method
  3. 编码引出的问题_FileReader读取GBK格式的文件
  4. SpringBoot_日志-SpringBoot默认配
  5. 适配器模式源码解析(jdk+spring+springjpa+springmvc)
  6. Github Pages 搭建网站
  7. 对于Dubbo一些自己的答案
  8. 按键改变元素背景颜色 链式编程的原理 评分案例 each方法的使用
  9. html5的api有什么区别,HTML入门--浅谈HTML和HTML5有什么区别?
  10. 洛谷 P1983 车站分级