POJ 2104为例【经典划分树问题】

思想:

利用快速排序思想,

  • 建树时将区间内的值与区间中值相比,小于则放入左子树,大于则放入右子树,如果相等则放入左子树直到放满区间一半。
  • 查询时,在建树过程中利用leftsum[p][i]数组保存有多少个数划分到第p层,第i个位置的左边。每次查询计算出每个区间有多少数被放入左子树,小于等于k则说明所求数在左子树,继续查询其左子树,反之则查询右子树。l==r时则找到。
  • 时间复杂度O(nlogn+mlogn)

代码:

#include<cstdio>
#include<algorithm>
using namespace std;//[]
const int maxn = 100010;
int tree[20][maxn];//每层每个位置的值
int sorted[maxn];//排好序的数组,方便寻找中值
int leftsum[20][maxn];//有多少个数分到该层该位置左边
void build(int p, int l, int r)
{
if(l == r) return;
int mid = (l + r)/2;
int same = mid - l + 1;
int x = sorted[mid];
for(int i = l; i <= r; i++){
if(tree[p][i] < x) same--;
}//与中值相等的数填满区间一半
int tl = l, tr = mid + 1;
for(int i = l; i <= r; i++){
if(tree[p][i] < x)
tree[p + 1][tl++] = tree[p][i];
else if(tree[p][i] == x && same>0){
tree[p + 1][tl++] = tree[p][i];
same--;
}else
tree[p + 1][tr++] = tree[p][i];
leftsum[p][i] = leftsum[p][l-1] + tl - l;
}
build(p + 1, l, mid);
build(p + 1, mid + 1, r);
}
//[L,R]中的[l,r]的第k大数
int query(int L, int R, int l, int r, int p, int k)
{
if(l == r) return tree[p][l];
int mid = (L + R)/2;
int cnt = leftsum[p][r] - leftsum[p][l-1];
if(cnt >= k){
int newl = L + leftsum[p][l-1] - leftsum[p][L-1];
int newr = newl + cnt - 1;
return query(L, mid, newl, newr, p+1, k);
}else {
int newr = r + leftsum[p][R] - leftsum[p][r];
int newl = newr - (r - l - cnt);
return query(mid+1, R, newl, newr, p+1, k - cnt);
}
}
int main (void)
{
int n, m;scanf("%d%d",&n,&m);
for(int i = 1; i <=n; i++){//下标从1开始
scanf("%d",&tree[0][i]);
sorted[i] = tree[0][i];
}
sort(sorted+1, sorted+n+1);
build(0, 1,n);
int s, t, k;
while(m--){
scanf("%d%d%d",&s,&t,&k);
printf("%d\n",query(1, n, s, t, 0, k));
}
return 0;
}

划分树还是挺好理解的,接下来看看归并树和主席树。

静态区间第k大(划分树)的更多相关文章

  1. poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 43315   Accepted: 14296 Ca ...

  2. 静态区间第k大(归并树)

    POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...

  3. 主席树(静态区间第k大)

    前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...

  4. 可持久化线段树(主席树)——静态区间第k大

    主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...

  5. HDU3473--Minimum Sum(静态区间第k大)

    Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  6. POJ 2104 && POJ 2761 (静态区间第k大,主席树)

    查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...

  7. 静态区间第k大(主席树)

    POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...

  8. 主席树学习笔记(静态区间第k大)

    题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...

  9. POJ2104-- K-th Number(主席树静态区间第k大)

    [转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...

  10. HDU 2665 Kth number(主席树静态区间第K大)题解

    题意:问你区间第k大是谁 思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的. 具体可以看q学姐的B站视频 代码: #include<cmath> #i ...

随机推荐

  1. ES3之bind方法的实现模拟

    扩展Function原型方法,此处用myBind来模拟bind实现 Function.prototype.myBind = function(o /*,args*/){       //闭包无法获取t ...

  2. ScrollView属性

    1.文本内容过长,一个屏幕显示不下,这时候就把显示文本的 TextView包裹在ScrollView里面,可以做到滚动下滑查看的功能 2.隐藏滚动条 标签属性设置android:scrollbars= ...

  3. provider模式

    最近看代码有所感想吧.当底层API,发生变化时,可以使用Provider模式.既然是模式就一定的股则. 1.该模式对原有接口的封装. 2.该模式实现对API的封装,不显示细节,从而取消依赖关系. 3. ...

  4. Farseer.net轻量级开源框架 中级篇:Cookies、Session、Request

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(Mapping) 下一篇:Farseer.net轻量级开源框架 中级篇 ...

  5. js几个逻辑运算符的形象概括

    “&&”是逻辑与操作符,只有“&&”两边值同时满足(同时为真),整个表达式值才为真. b>a && b<c    //“&& ...

  6. oauth 理解

    单点登录 对授权码模式的解读. 1. 用户访问客户端,客户端将请求认证服务器. 2. 用户选择是否给予客户端授权 3.用户授权后,认证服务器将用户导向客户端事先定义好的重定向的地址,同时会附上一个授权 ...

  7. 模拟登陆request-session

    #人人网的模拟登录 import requests import urllib from lxml import etree #获取session对象 session = requests.Sessi ...

  8. HTTP请求报文与响应报文格式

    请求报文包含三部分: a.请求行:包含请求方法.URI.HTTP版本信息 b.请求首部字段 c.请求内容实体 响应报文包含三部分: a.状态行:包含HTTP版本.状态码.状态码的原因短语 b.响应首部 ...

  9. Java之Servlet文件下载20190228

    jsp页面: <%@ page language="java" contentType="text/html; charset=utf-8" pageEn ...

  10. SQLServer锁的概述

    SQLServer锁的概述   锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了 ...