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 ...
随机推荐
- Vue 使用百度地图组件
npm 安装 npm install vue-baidu-map --save组件官网地址 https://dafrok.github.io/vue-baidu-map/#/
- Difference Between static and default methods in interface
I was learning through interfaces when I noticed that you can now define static and default methods ...
- python3连接redis数据库
1.python想操作redis,需要安装第三方模块(我是在windows下进行操作的) pip install redis 2.连接数据库 #coding:utf-8 import redis r ...
- 追本溯源:substr与substring历史漫话
引子: 很多时候,当我要字符串截取时,我会想到substr和substring的方法,但是具体要怎么传参数时,我总是记不住.哪个应该传个字符串长度,哪个又应该传个开始和结尾的下标,如果我不去查查这两个 ...
- Java-NIO 之 Buffer 与 Channel
NIO:一种同步非阻塞的 I/O 模型,也是 I/O 多路复用的基础. 同步与异步 同步:发起一个调用后,被调用者未处理完请求之前,调用不返回. 异步:发起一个调用后,立刻得到被调用者的回应表示已接收 ...
- Flutter移动电商实战 --(1)项目学习记录
1.项目相关截图 2.项目知识点梳理图 Dio2.0: Dio是一个强大的 Dart Http 请求库,支持 Restful API.FormData.拦截器.请求取消等操作. Swiper: Swi ...
- linux不能ping通主机,主机能ping通linux
1).打开控制面板,点击“系统和安全”选项.然后打开“Windows防火墙”.2).点击进入“高级设置”,选择“入站规则”.3).在入门规则中找到“文件和打印机共享(回显请求-ICMPv4-In)”选 ...
- 【Makefile】Makefile中的赋值符号=、:=、?=、+=
Makefile中主要有四个赋值符号: = 是最基本的赋值:= 是覆盖之前的值?= 是如果没有被赋值过就赋予等号后面的值+= 是添加等号后面的值 1.“=” “=”赋值:make会将整个makefil ...
- Python多进程库multiprocessing创建进程以及进程池Pool类的使用
问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...
- 模型压缩-Learning Efficient Convolutional Networks through Network Slimming
Zhuang Liu主页:https://liuzhuang13.github.io/ Learning Efficient Convolutional Networks through Networ ...