题目传送门//res tp hdu

目的

对长度为n的区间,m次询问,每次提供一个区间两端点与一个值x,求区间内不超过x的元素个数

n 1e5

m 1e5

ai [1,1e9] (i∈[1,n])

多测

数据结构与……?

划分树 + 二分查找

分析

建树0(nlogn)

单次查询第k小,需O(logn)

蛮力枚举区间内所有元素,查看是否大于x,需O(nlogn),m次询问,总O(mnlogn),显然会超时。

考虑以二分x的方式枚举出不超过x的最大上界只需O(mlogxlogn)。这种方法是可接受的。

#include<iostream>
#include<algorithm>
using namespace std;
const int L = 100010;
int tr[18][L],cnt[18][L],n,m,sor[L]; void build(int de,int l,int r){
if(l == r) return;
int mi = (l + r)>>1;
int scnt = mi - l + 1;
int M = sor[mi];
for(int i = l;i<=r;++i) if(tr[de][i] < M) scnt--;
int pl = l,pr = mi + 1;
for(int i = l,cntl = 0;i<=r;++i){
int num = tr[de][i];
if(num < M ||(num == M && scnt > 0)){
if(num == M) --scnt;
++cntl;
tr[de+1][pl++] = num;
}
else tr[de+1][pr++] = num;
cnt[de][i] = cntl;
}
build(de+1,l,mi);
build(de+1,mi+1,r);
}
int query(int de,int L,int R,int l,int r,int k){
if(L == R) return tr[de][L];
int mi = (L + R)>>1;
int left = 0,cnt_in_left = cnt[de][r];
if(L != l){
left = cnt[de][l-1];
cnt_in_left -= left;
}
if( k <= cnt_in_left ){
int newl = L + left;
int newr = newl + cnt_in_left - 1;
return query(de+1,L,mi,newl,newr,k);
}
else{
int a = l - L - left;
int b = r - l + 1 - cnt_in_left;
int newl = mi + 1 + a;
int newr = newl + b - 1;
return query(de+1,mi+1,R,newl,newr,k - cnt_in_left);
}
}
int Q(int l,int r,int h){
int lo = 1,hi = r - l + 1;
while(lo <= hi){
int mi = (lo + hi)>>1;
int M =query(0,1,n,l,r,mi);
if(h < M ) hi = mi-1;
else lo = mi + 1;
}
return --lo;
}
int main(){
int T,icase = 1,l,r,h,ans;
scanf(" %d",&T);
while(T--){
scanf(" %d %d",&n,&m);
for(int i = 1;i<=n;++i){
scanf(" %d",&sor[i]);
tr[0][i] = sor[i];
}
sort(sor+1,sor+1+n);
build(0,1,n);
printf("Case %d:\n",icase++);
while(m--){
scanf(" %d %d %d",&l,&r,&h);
ans = Q(l+1,r+1,h);
printf("%d\n",ans);
}
}
}

hdu 4471 区间条件统计 区间 不超过 x 的元素的个数的更多相关文章

  1. HDU 5023线段树区间染色,统计区间内颜色个数

    这个也是一个线段树的模板 #include<iostream> #include<string.h> #include<algorithm> #include< ...

  2. PHP 统计一维数组value同样的元素的个数num,并将其转化为下标为数字,值是value和num的二维数组

    近期做一个项目.从数据库查询某个字段得到一个数组key是数字值是channel的一维数组$res,现须要将这个数组变成键是数字值是channel和num(num为同样channel的数量,默觉得0). ...

  3. 统计js数组中奇数元素的个数

    如何统计一个JS数组中奇数元素的个数呢? 这是群友提出的一个问题,大部分群友给出的是遍历 然后对2取模,得到最终结果. 这样的写法是最容易想得到的,那么有没有其他思路呢? 这里我提供另外一种思路,我们 ...

  4. Excel 统计区间频数,按照条件标记

    MS Office 2013   统计区间频数--countif函数   如要统计[75,90)区间段的成绩,使用 =COUNTIF(L3:L44, ">=75")-COUN ...

  5. hdu 5023(线段树区间染色,统计区间内颜色个数)

    题目描述:区间染色问题,统计给定区间内有多少种颜色? 线段树模板的核心是对标记的处理 可以记下沿途经过的标记,到达目的节点之后一块算,也可以更新的时候直接更新到每一个节点 Lazy操作减少修改的次数( ...

  6. poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 43507   Accepted: 12693 ...

  7. HDU 5151 Sit sit sit 区间DP + 排列组合

    Sit sit sit 问题描述 在一个XX大学中有NN张椅子排成一排,椅子上都没有人,每张椅子都有颜色,分别为蓝色或者红色. 接下来依次来了NN个学生,标号依次为1,2,3,...,N. 对于每个学 ...

  8. HDU 3308 LCIS 线段树区间更新

    最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛  ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...

  9. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

随机推荐

  1. Linux查看进程的启动路径——pwdx

    想要找到transfer的启动路径. 一般是ps -ef | grep keyward 但是这个刚好是没有用绝对路径执行. 再用pwdx  pid获得

  2. Java基础_线程的使用及创建线程的三种方法

    线程:线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 进程:进 ...

  3. hadoop HA+Federation(高可用联邦)搭建配置(一)

    hadoop HA+Federation(高可用联邦)搭建配置(一) 标签(空格分隔): 未分类 介绍 hadoop 集群一共有4种部署模式,详见<hadoop 生态圈介绍>. HA联邦模 ...

  4. 【零基础】彻底搞懂51单片机各种型号(ATMEL系列)

    零.前言 初学者开始学习51单片机时往往先是一愣,说好51单片机啊,咋个型号是AT89C52,这个S52又是咋回事?上学的时候大都懵懵懂懂就这么用着,但始终没整明白,所以今天我们就彻底搞明白这些“51 ...

  5. np数组转换函数

    1.多维数组降为一维: a = np.arange(24) np.ravel(a)或者a.ravel a.flatten 2.数据类型转换 a = a.astype(np.float32) //tf是 ...

  6. 框架 | Spring面试题总结

    1.什么是Spring? Spring是一个开源的Java EE开发框架.Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性.Sprin ...

  7. Tomcat多实例集群架构 安全优化和性能优化

    Tomcat多实例 复制tomcat目录 /usr/local/tomcat1 /usr/local/tomcat2 修改多实例配置文件 #创建多实例的网页根目录 mkdir -p /data/www ...

  8. matlab将字符串转化为变量的方法

    1.将字符串转化为变量的方法,执行 eval(x) 2.将变量转化为字符串的方法,执行 char(a) 讲解 aa = 98 x = 'aa' 目标:通过x得到98,即x->aa->98, ...

  9. matlab处理矩阵

    1.提取大矩阵的一列.一行元素:一列元素:  A(:,j)表示提取A矩阵的第j列全部元素一行元素:  A(i,:)表示提取A矩阵的第i行元素,于是我们有,A(i, j)表示提取A矩阵的第i行第j列的元 ...

  10. Rsa加密类

    需要导入Base64.jar包 import java.io.ByteArrayOutputStream; import java.security.Key; import java.security ...