hdu 4471 区间条件统计 区间 不超过 x 的元素的个数
题目传送门//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 的元素的个数的更多相关文章
- HDU 5023线段树区间染色,统计区间内颜色个数
这个也是一个线段树的模板 #include<iostream> #include<string.h> #include<algorithm> #include< ...
- PHP 统计一维数组value同样的元素的个数num,并将其转化为下标为数字,值是value和num的二维数组
近期做一个项目.从数据库查询某个字段得到一个数组key是数字值是channel的一维数组$res,现须要将这个数组变成键是数字值是channel和num(num为同样channel的数量,默觉得0). ...
- 统计js数组中奇数元素的个数
如何统计一个JS数组中奇数元素的个数呢? 这是群友提出的一个问题,大部分群友给出的是遍历 然后对2取模,得到最终结果. 这样的写法是最容易想得到的,那么有没有其他思路呢? 这里我提供另外一种思路,我们 ...
- Excel 统计区间频数,按照条件标记
MS Office 2013 统计区间频数--countif函数 如要统计[75,90)区间段的成绩,使用 =COUNTIF(L3:L44, ">=75")-COUN ...
- hdu 5023(线段树区间染色,统计区间内颜色个数)
题目描述:区间染色问题,统计给定区间内有多少种颜色? 线段树模板的核心是对标记的处理 可以记下沿途经过的标记,到达目的节点之后一块算,也可以更新的时候直接更新到每一个节点 Lazy操作减少修改的次数( ...
- poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 43507 Accepted: 12693 ...
- HDU 5151 Sit sit sit 区间DP + 排列组合
Sit sit sit 问题描述 在一个XX大学中有NN张椅子排成一排,椅子上都没有人,每张椅子都有颜色,分别为蓝色或者红色. 接下来依次来了NN个学生,标号依次为1,2,3,...,N. 对于每个学 ...
- HDU 3308 LCIS 线段树区间更新
最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛 ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
随机推荐
- jQuery系列(十四):jQuery中的ajax
1.什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJAX通过后台加载数据,并在 ...
- Redis evalsha 命令
相当于根据sha1校验码,执行缓存在服务器的一段代码. 这个命令的使用方法类似eval--参数的传入方式等等 使用需要redis版本 >= 2.6.0 语法 *> evalsha sha1 ...
- mybatis 多级级联(多级嵌套)
注:笔者这里的嵌套可以用词有点欠缺,忘见谅 需求:用一个查询接口查出其结果集,这里就用伪代码标识要返回前端的类与类之间的关系. class 顶层{ String otherValue; LinkedL ...
- JsonObject处理时间转换问题
正常传时间的时候使用JsonObject转换的时候会把整个日期都转换成一个新的对象,而如何转换成传统的yyyy-MM-dd HH:mm:ss类型呢 常用的时间格式 private String for ...
- mybatis批量查询引发的血案
mybatis提供了foreach语法用于所谓的批量查询,使用方式如下: ①.定义接口 /** * 批量获取任务id列表对应的任务名称 * @param taskIdList:任务id列表 * @re ...
- 【零基础】彻底搞懂51单片机各种型号(ATMEL系列)
零.前言 初学者开始学习51单片机时往往先是一愣,说好51单片机啊,咋个型号是AT89C52,这个S52又是咋回事?上学的时候大都懵懵懂懂就这么用着,但始终没整明白,所以今天我们就彻底搞明白这些“51 ...
- mybatis用Map<Long,List<String>>作为参数
mapper.xml文件里的<insert id="insertByMap" parameterType="java.util.Map"> inse ...
- Linux设备驱动程序 之 open和release
open方法 open方法提供给驱动程序以初始化的能力,在大部分驱动程序汇总,open应该完成以下工作: 1. 检查特定设备的错误,如设备为准备就绪或者硬件问题: 2. 如果设备是首次打开,则对其进行 ...
- Qt图形测绘窗口部件介绍
Qt 图形测绘窗口部件,主要使用第三方窗口部件: 1.Qwt:http://qwt.sourceforge.net 开源免费 2.GraphPak: http://www.ics.com 收费 3. ...
- mac安装phpmysql
1.百度搜“phpmadmin”,还是一样,第二个因为是PC版本,不能用,点击第一个连接,去phpmyadmin的官网. 2.下载完毕后,进入到下载文件保存目录,双击压缩包,压缩包则会自动解压. 3. ...