题目传送门//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. umei-spider

    umei-spider 1 #!/usr/bin/python3 2 3 import requests 4 from bs4 import BeautifulSoup 5 from contextl ...

  2. UVA 796 Critical Links —— (求割边(桥))

    和求割点类似,只要把>=改成>即可.这里想解释一下的是,无向图没有重边,怎么可以使得low[v]=dfn[u]呢?只要它们之间再来一个点即可. 总感觉图论要很仔细地想啊- -一不小心就弄混 ...

  3. AT3576 Popping Balls

    AT3576 Popping Balls 好题!一种以前没怎么见过的思路! %%ywy 以什么方式,什么位置统计本质不同的方案,才能不重不漏是处理所有计数问题的主心骨. 本题难以容斥.难以DP. 所以 ...

  4. Linux设备驱动程序 之 度量时间差

    概述 内核通过定时器中断来跟踪事件流: 时钟中断由系统定时硬件以及周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个细节结构有关的常数:作为一般性规则,即使知道对应平台上的确切HZ值,也不应 ...

  5. DS博客作业04--树大作业

    1.树的存储结构 本组采用的树的存储结构为链式结构,选择如图所示的结构体 Name为结点的名称 LevelNum为孩子节点的个数 *Children[20]用来指向不同的孩子结点(类似于二叉树的结构体 ...

  6. redis事务机制和分布式锁

    Redis事务机制 严格意义来讲,Redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的:Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事物都不执行.  ...

  7. PyTorch中使用深度学习(CNN和LSTM)的自动图像标题

    介绍 深度学习现在是一个非常猖獗的领域 - 有如此多的应用程序日复一日地出现.深入了解深度学习的最佳方法是亲自动手.尽可能多地参与项目,并尝试自己完成.这将帮助您更深入地掌握主题,并帮助您成为更好的深 ...

  8. 生成 XML 文档时出错。

    找来找去,在CSDN 里看到高手解答了. 原来 WebService 传递参数时,不能使用 DataTable 如果需要使用DataTable  那就要用 DataSet  包装起来. 如果担心数据太 ...

  9. spring cloud consul上下线体验

    spring cloud consul中默认会将spring.application.name作为ID 同一服务起多个实例时,ID默认会变成${spring.application.name}-${s ...

  10. openstack核心组件--cinder存储服务(6)

    一.cinder 介绍:   理解 Block Storage 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系 ...