题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4417

题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数。注意区间是从0开始的。

解题思路

首先这题线段树可以解。方法是维护一个区间最大值max,一个区间点个数s,如果k>max,则ans=s+Q(rson),否则ans=Q(lson)。

然后也可以用求区间第K大的划分树来解决,在对原来求第K大的基础上改改就行,方法如下:

Build方法同第K大。

对于Query:

①左区间求法:

if(sorted[mid]>k)进行左区间查询:注意不能等于k,原因是左区间是不包含sorted[mid];同时左区间中newr=newl+cnt-1,

当cnt=0时,即k值是当前区间最大值,会导致newl>newr,需要特判.

②右区间求法:

上面的条件else就是右区间,ans=cnt+Q(右区间)

③区间l=r时:

如果tree[dep][l]<=k,则return 1

反之return 0

模板参照上海大学的模板王kuangbin大神:

#include "cstdio"
#include "algorithm"
#include "cstring"
using namespace std;
#define maxn 100005
int tree[][maxn],sorted[maxn],toleft[][maxn];
void Build(int l,int r,int dep)
{
if(l==r) return;
int mid=(l+r)>>;
int same=mid-l+;
for(int i=l;i<=r;i++)
if(tree[dep][i]<sorted[mid]) same--;
int lpos=l,rpos=mid+;
for(int i=l;i<=r;i++)
{
if(tree[dep][i]<sorted[mid])
tree[dep+][lpos++]=tree[dep][i];
else if(tree[dep][i]==sorted[mid]&&same>)
{
tree[dep+][lpos++]=tree[dep][i];
same--;
}
else tree[dep+][rpos++]=tree[dep][i];
toleft[dep][i]=toleft[dep][l-]+lpos-l;
}
Build(l,mid,dep+);
Build(mid+,r,dep+);
}
int query(int L,int R,int l,int r,int dep,int k)
{
if(l==r)
{
if(tree[dep][l]<=k) return ;
else return ;
}
int mid=(L+R)>>;
int cnt=toleft[dep][r]-toleft[dep][l-];
if(sorted[mid]>k)
{
int newl=L+toleft[dep][l-]-toleft[dep][L-];
int newr=newl+cnt-;
if(newr>=newl) query(L,mid,newl,newr,dep+,k);//如果Q的是区间最大值,则cnt=0,newl>newr
else return ;
}
else
{
int newr=r+toleft[dep][R]-toleft[dep][r];
int newl=newr-(r-l-cnt);
return cnt+query(mid+,R,newl,newr,dep+,k);
}
}
int main()
{
//freopen("in.txt","r",stdin);
int T,n,m,u,v,w,no=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(tree,,sizeof(tree));
memset(toleft,,sizeof(toleft));
for(int i=;i<=n;i++)
{
scanf("%d",&tree[][i]);
sorted[i]=tree[][i];
}
sort(sorted+,sorted+n+);
Build(,n,);
printf("Case %d:\n",++no);
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
u++;v++;
printf("%d\n",query(,n,u,v,,w));
}
}
}
11836396 2014-10-10 00:48:26 Accepted 4417 187MS 16288K 2014 B C++ Physcal

HDU 4417 (划分树+区间小于k统计)的更多相关文章

  1. hdu 4417 划分树

    思路:二分枚举区间第k大.用划分树查找是否符合要求的高度. #include<iostream> #include<algorithm> #include<cstdio& ...

  2. HDU 4417 划分树+二分

    题意:有n个数.m个询问(l,r,k),问在区间[l,r] 有多少个数小于等于k. 划分树--查找区间第k大的数.... 利用划分树的性质.二分查找在区间[l,r]小于等于k的个数. 假设在区间第 i ...

  3. HDU 4417 划分树写法

    Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability re ...

  4. HDU 6278 主席树(区间第k大)+二分

    Just h-index Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)To ...

  5. hdu 5919 主席树(区间不同数的个数 + 区间第k大)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  6. Super Mario HDU 4417 主席树区间查询

    Super Mario HDU 4417 主席树区间查询 题意 给你n个数(编号从0开始),然后查询区间内小于k的数的个数. 解题思路 这个可以使用主席树来处理,因为这个很类似查询区间内的第k小的问题 ...

  7. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  8. Super Mario HDU - 4417 (主席树询问区间比k小的个数)

    Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory ...

  9. poj2104 划分树 区间K大 在线 无修改

    博主sbit....对于高级数据结构深感无力,然后这些东西在OI竟然烂大街了,不搞就整个人都不好了呢. 于是我勇猛的跳进了这个大坑 ——sbit 区间K大的裸题,在线,无修改. 可以用归并树(\(O( ...

随机推荐

  1. 数据库多张表导出到excel

    数据库多张表导出到excel public static void export() throws Exception{ //声明需要导出的数据库 String dbName = "hdcl ...

  2. linux shell expr 使用

    linux shell expr 使用 收藏人:春秋百味 -- | 阅: 转: | | 分享 非原创, 摘自:<LINUX与UNIX Shell编程指南> 17.5 expr用法 expr ...

  3. vi命令的基础知识

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,先说说一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您 ...

  4. php配置文件语法

    2013年12月11日 09:21:58 ; The syntax of the file is extremely simple. Whitespace and lines ; beginning ...

  5. Java for LeetCode 023 Merge k Sorted Lists

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解 ...

  6. javascript ASCII和Hex互转

    <script> var symbols = " !\"#$%&'()*+,-./0123456789:;<=>?@"; var loAZ ...

  7. Emblog 备忘

    emblog换后台:(如admin-->xx) 1.xx目录下的globals.php打开找到替换admin(1) 2.www目录下的t\index.php 中找到替换admin(1) 3.ww ...

  8. AsyncHttpClient

    package com.jingle.httpstudy;   import org.apache.http.Header;   import android.app.Activity; import ...

  9. 菜鸟学Linux命令:ssh命令 远程登录

    1.查看SSH客户端版本 有的时候需要确认一下SSH客户端及其相应的版本号.使用ssh -V命令可以得到版本号.需要注意的是,Linux一般自带的是OpenSSH: 下面的例子即表明该系统正在使用Op ...

  10. ***php解析JSON二维数组字符串(json_decode函数第二个参数True和False的区别)

    客户端的请求体中的数据:[{"msg_id": 1, "msg_status": "HAS_READ" }, { "msg_id& ...