题意:有n个数。m个询问(l,r,k),问在区间[l,r] 有多少个数小于等于k。

划分树——查找区间第k大的数。。。。

利用划分树的性质。二分查找在区间[l,r]小于等于k的个数。

假设在区间第 i 大的数tmp>k,则往下找,假设tmp<k,往上找。

 

#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<map>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
#define INF 1e8
#define eps 1e-8
#define LL long long
#define N 100010
#define mod 1000000007 int a[N],s[N],t[20][N],num[20][N],n,m; void build(int c,int l,int r)
{
if(l==r) return;
int mid=(l+r)/2;
int lm=mid-l+1,lp=l,rp=mid+1;
for(int i=l;i<=r;i++)
lm-=s[i]<s[mid];
for(int i=l;i<=r;i++)
{
if(i==l)
num[c][i]=0;
else num[c][i]=num[c][i-1];
if(t[c][i]==s[mid])
{
if(lm)
{
lm--;
num[c][i]++;
t[c+1][lp++]=t[c][i];
}
else t[c+1][rp++]=t[c][i];
}
else if(t[c][i]<s[mid])
{
num[c][i]++;
t[c+1][lp++]=t[c][i];
}
else t[c+1][rp++]=t[c][i];
}
build(c+1,l,mid);
build(c+1,mid+1,r);
} int query(int c,int l,int r,int ql,int qr,int k)
{
if(l==r)
return t[c][l];
int s,ss,mid=(l+r)/2;
if(ql==l)
s=0,ss=num[c][qr];
else s=num[c][ql-1],ss=num[c][qr]-num[c][ql-1];
if(k<=ss)
return query(c+1,l,mid,l+s,s+l+ss-1,k);
else return query(c+1,mid+1,r,mid+1+ql-l-s,mid+1+qr-l-s-ss,k-ss);
} int main()
{
int T,ca=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s[i]=t[0][i]=a[i];
}
sort(s+1,s+n+1);
build(0,1,n);
printf("Case %d:\n",ca++);
while(m--)
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
l++;r++;
if(query(0,1,n,l,r,r-l+1)<=k)
printf("%d\n",r-l+1);
else if(query(0,1,n,l,r,1)>k)
puts("0");
else
{
int ll=0,rr=r-l+1,mid;
while(ll<=rr)
{
mid=(ll+rr)>>1;
int tmp=query(0,1,n,l,r,mid);//假设在区间[l,r]第mid大的数大于k,rr=mid-1
if(tmp>k)
rr=mid-1;
else ll=mid+1;//否则ll=mid+1
}
printf("%d\n",ll-1);
}
}
}
return 0;
}
/*
1
10 10
0 5 2 7 5 4 3 8 7 7
2 8 6
3 5 0
1 3 1
1 9 4
0 1 0
3 5 5
5 5 1
4 6 3
1 5 7
5 7 3
*/

HDU 4417 划分树+二分的更多相关文章

  1. HDU 4417 (划分树+区间小于k统计)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...

  2. hdu 4417 划分树

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

  3. HDU 4417 划分树写法

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

  4. sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)

    Boring Counting Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述     In this problem you a ...

  5. HDU-4417 Super Mario,划分树+二分!

    Super Mario 这个题也做了一天,思路是很清晰,不过二分那里写残了,然后又是无限RE.. 题意:就是查询区间不大于k的数的个数. 思路:裸划分树+二分答案.将区间长度作为二分范围.这个是重点. ...

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

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

  7. HDU 4417 - Super Mario ( 划分树+二分 / 树状数组+离线处理+离散化)

    题意:给一个数组,每次询问输出在区间[L,R]之间小于H的数字的个数. 此题可以使用划分树在线解决. 划分树可以快速查询区间第K小个数字.逆向思考,判断小于H的最大的一个数字是区间第几小数,即是答案. ...

  8. 【划分树+二分】HDU 4417 Super Mario

    第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

  9. hdu4417 划分树+二分

    //Accepted 14796 KB 453 ms //划分树 //把查询的次数m打成n,也是醉了一晚上!!! //二分l--r区间第k大的数和h比较 #include <cstdio> ...

随机推荐

  1. Python的程序结构[2] -> 类/Class[0] -> 类的特殊属性

    类的特殊属性 / Special Property of Class Python 中通过 class 进行类的定义,类可以实例化成实例并利用实例对方法进行调用. 类中还包含的一些共有的特殊属性. 特 ...

  2. Python的程序结构[8] -> 装饰器/Decorator -> 装饰器浅析

    装饰器 / Decorator 目录 关于闭包 装饰器的本质 语法糖 装饰器传入参数 1 关于闭包 / About Closure 装饰器其本质是一个闭包函数,为此首先理解闭包的含义. 闭包(Clos ...

  3. XML签名

    英文:https://www.javacodegeeks.com/2013/10/xml-security-with-digital-signature-in-java.html 中文:http:// ...

  4. Codeforces 1018D D. Order book

    解法:用l,r分别代表buy的最大值和sell的最小值,add时,若添加的值在l,r之间,则该值有可能作为下一次accept的值 accept x时,x只能在区间[l,r]中,否则无解,若x为l或r, ...

  5. SQL 统计某一列出现的总和

    现有数据如上图所示,要求统计出日期相同的Count总数,并且加一列统计前面日期Count的总和 SELECT SUM([Count]) AS DayTotal, SUM(SUM([Count])) o ...

  6. Java字符串(String)

    从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串:    String stringName ...

  7. 集合框架(Collection和Collections的区别)

    1.Collection: java.util.Collection 是一个集合接口. 它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体的实现.Col ...

  8. 在linux下给grep命令添加颜色

    1打开文件,添加如下一段话         vim ~/.bashrc           alias grep='grep --color'   2退出保存     source ~/.bashrc ...

  9. mysql如何用jsp代码进行数据库备份

    mysql如何用jsp代码进行数据库备份 //导出 String mysql="mysqldump -uroot -proot --opt databasename > d:/test ...

  10. [分享]在ubuntu9.10下实现开机自动登录并运行自己的图形程序

    在ubuntu9.10下实现开机自动登录并运行自己的图形界面程序(本人接触ubuntu时日不长,文中一些说法难免有错误和疏漏之处,还请大家不吝批评指正.)实现步骤分以下三大步:1. 实现ubuntu文 ...