区间第K大(划分树)
题目: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大(划分树)相关推荐
- J - [永不止步-2017]_区间第K大-线段树维护
J - [永不止步-2017]_区间第K大 把线段树的结点的数据域设置为vector类型即可别的操作为区间更新模板 思路就是这样runtime error暂时没改对 #include<bits/ ...
- P2617 Dynamic Rankings 动态区间第K大【树套树】或【整体二分】
传送门 动态区间第KKK大问题,单点修改(这里是第kkk小,即是从小到大第kkk个) 这里还有个区间修改,有点类似的 P3332 [ZJOI2013]K大数查询 分析 树套树 树套树,就是用一种树形结 ...
- HDU2665 求区间第K大 主席树
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2665 代码: //#include<bits/stdc++.h> #include< ...
- hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)
题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- Dynamic Rankings——带修改区间第k大
三种做法: 1.整体二分: 二分mid 考虑小于mid的修改的影响 但是大于mid的修改可能会干掉小于mid的一些值 所以额外把一个修改变成一个值的删除和一个值的添加 这样就相互独立了! 整体二分,树 ...
- poj2104(区间第k大+离散化)
题意: 给定一个序列,求[a,b]区间第k大的数字. 思路: 主席树模板题,但是注意数据范围,需要离散化. 代码: #include<cstdio> #include<cstring ...
- O(n)复杂度求区间第K大
O(n)复杂度求区间第K大 描述 给你一个数组,O(N)复杂度找出其中第K大的数. 输入 第一行包括两个数,N,K,分别代表数组大小,以及你应该找出第K大的数. 接下来N行,每行包括一个数. 输出 ...
- HDU2665(函数式线段树-区间第K大)
题目:K-th Number 如果求区间第K小,就转换一下就行了,假设你要求区间[u,v]的第k小,那就是第v-u+1-k大 #include<stdio.h> #include<a ...
最新文章
- 2022-2028年中国康养旅游行业市场竞争力分析及发展策略分析报告
- 【 Vivado 】基本的时序约束、分析的概念
- 企业官网页面设计谨记三个要点!
- orcale存储过程学习之路(一)
- 【数据结构与算法】之面试必考的“二分算法”系统梳理
- top进阶命令htop运用
- android学习笔记---35_Intent意图,深入解剖
- java url转成pdf_java URL转PDF文件
- [洛谷P3979]遥远的国度
- python列表排序sort_python列表排序方法reverse、sort、sorted
- 可编辑ppt地图分布图怎么做?
- csdn 问答使用与测评
- 遥感图像计算机自动分类原理,第30讲:8.1遥感图像自动识别分类
- openGL 中 glColor3f()函数 颜色设定
- DQL、DML、DDL、DCL的定义
- 适配80mm打印机网页打印自动高度问题
- python如何群控手机_python调用adb脚本来实现群控安卓手机初探
- asp 复数个oracle链接,asp中的各种数据库连接方法
- Java自定义拦截器处理防抖
- 应收账款管理存在哪些问题?如何解决
热门文章
- 未付服务网关限流作用
- 反射_Class对象功能_获取Method
- 编码引出的问题_FileReader读取GBK格式的文件
- SpringBoot_日志-SpringBoot默认配
- 适配器模式源码解析(jdk+spring+springjpa+springmvc)
- Github Pages 搭建网站
- 对于Dubbo一些自己的答案
- 按键改变元素背景颜色 链式编程的原理 评分案例 each方法的使用
- html5的api有什么区别,HTML入门--浅谈HTML和HTML5有什么区别?
- 洛谷 P1983 车站分级