题目链接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. ZeroMQ安装

    一.ZeroMQ介绍 ZeroMQ是一个开源的消息队列系统,按照官方的定义,它是一个消息通信库,帮助开发者设计分布式和并行的应用程序. 首先,我们需要明白,ZeroMQ不是传统的消息队列系统(比如Ac ...

  2. LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android

    LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android jincon 发表于 2015-02-26 18:31:01 发表在: php开发 localresiz ...

  3. LInux 安全测试

    [CVE-2013-2094]Linux PREF_EVENTS Local Root 2.6.37-3.8.10 x86_64 踩(0)http://zone.wooyun.org/content/ ...

  4. javascript的事件监听与捕获和冒泡

    在前端开发中,我们经常需要对某些事件进行监听.这样只要在指定的元素上触发了该事件,就会执行一个回调来进行相关的操作. 而js中事件监听方法总共有三种,分别如下所示: element.addEventL ...

  5. iOS 中的字体预览

    要预览iOS的各种字体的效果,可以访问http://iosfonts.com

  6. Java for LeetCode 041 First Missing Positive

    Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] ...

  7. codeforces A. Vasya and Digital Root 解题报告

    题目链接:http://codeforces.com/problemset/problem/355/A 题目意思:找出某个经过最多四次dr(n)操作等于d的k位数.   千万不要想得太复杂,想得越简单 ...

  8. 【python】Python标准库defaultdict模块

    来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...

  9. [产品相关] A/B测试终极指南(翻译)

    转载地址: http://blog.sina.com.cn/s/blog_9149268d0100zrx7.html 还记得以前导师说看了英文的文章就把它翻译一下吧,这样会对文章更好地理解,也会有更深 ...

  10. ecshop绕过验证码暴力破解

    若验证码不匹配,并没有销毁当前验证码   所以就可以一次请求验证码图片后,只要不再刷新验证码就可以一直使用  1.获取正确的验证码   2. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...