HDU 4417
题意略。
思路:
仔细思考这个题目会发现,它其实是要你查询两次,第一是要规定l,r的范围,第二是要在范围内查询小于等于H的个数。所以有的人说要用主席树。
现在,如果我们能省去范围内对h的查询呢?也就是说,在查询范围时,我们就要保证这个范围内的所有hi都小于等于H的数字。
我们可以离线地来做。这样就只需要树状数组了,不再需要主席树了。
详见代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + ; struct node{
int idx,numb;
node(int idx = ,int numb = ){
this->idx = idx;
this->numb = numb;
}
};
struct query{
int l,r,h,id;
query(int l = ,int r = ,int h = ,int id = ){
this->l = l,this->r = r,this->h = h;
this->id = id;
}
}; node store[maxn];
query depot[maxn];
int BIT[maxn],n,m,ans[maxn]; bool cmp1(const node& n1,const node& n2){
return n1.numb < n2.numb;
}
bool cmp2(const query& q1,const query& q2){
return q1.h < q2.h;
}
int lowbit(int k){
return (k & -k);
}
void add(int pos,int val){
while(pos <= n){
BIT[pos] += val;
pos += lowbit(pos);
}
}
int sum(int pos){
int ret = ;
while(pos > ){
ret += BIT[pos];
pos -= lowbit(pos);
}
return ret;
} int main(){
int T,cas = ;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
memset(BIT,,sizeof(BIT));
for(int i = ;i <= n;++i){
scanf("%d",&store[i].numb);
store[i].idx = i;
}
sort(store + ,store + + n,cmp1);
for(int i = ;i < m;++i){
scanf("%d%d%d",&depot[i].l,&depot[i].r,&depot[i].h);
depot[i].id = i;
depot[i].l += ;
depot[i].r += ;
}
sort(depot,depot + m,cmp2);
int last = ;
for(int i = ;i < m;++i){
int h = depot[i].h,l = depot[i].l;
int r = depot[i].r,id = depot[i].id;
for(;last <= n && store[last].numb <= h;++last)
add(store[last].idx,);
int t = sum(r) - sum(l - );
ans[id] = t;
}
printf("Case %d:\n",cas++);
for(int i = ;i < m;++i)
printf("%d\n",ans[i]);
}
return ;
}
HDU 4417的更多相关文章
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Super Mario HDU 4417 主席树区间查询
Super Mario HDU 4417 主席树区间查询 题意 给你n个数(编号从0开始),然后查询区间内小于k的数的个数. 解题思路 这个可以使用主席树来处理,因为这个很类似查询区间内的第k小的问题 ...
- J - Super Mario HDU - 4417 线段树 离线处理 区间排序
J - Super Mario HDU - 4417 这个题目我开始直接暴力,然后就超时了,不知道该怎么做,直接看了题解,这个习惯其实不太好. 不过网上的思路真的很厉害,看完之后有点伤心,感觉自己应该 ...
- HDU 4417 (划分树+区间小于k统计)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...
- HDU 4417:Super Mario(主席树)
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意是:给出n个数和q个询问,每个询问有一个l,r,h,问在[l,r]这个区间里面有多少个数是小于等于h的 ...
- [HDU 4417] Super Mario (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给你n个数,下标为0到n-1,m个查询,问查询区间[l,r]之间小于等于x的数有多少个 ...
- hdu 4417 Super Mario/树套树
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意很简单,给定一个序列求一个区间 [L, R,]中小于等于H的元素的个数. 好像函数式线段树可 ...
- hdu 4417 Super Mario (主席树)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给你段长为n的序列,有q个询问,每次询问区间[l.r]内有多少个数小于等于k 思路: 之前用 ...
- [hdu 4417]树状数组+离散化+离线处理
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 把数字离散化,一个查询拆成两个查询,每次查询一个前缀的和.主要问题是这个数组是静态的,如果带修改 ...
- HDU 4417 【线段树+离线处理】
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意:找出给定区间内,有多少个数小于等于给定的数.用线段树维护的话会超时,要用到线段树的离线操作,对询问与 ...
随机推荐
- CSS(下)
1.CSS边框 边框属性: 1.border-width 宽度 2.border-style 样式 none 无边框 dotted 点状虚线边框 dashed 矩形虚线边框 solid 实线边框 3. ...
- C# 怎样将DateTime类型进行日期的加减
C#中 DateTime类型有封装好的函数 例如: //将当前时间转换为指定格式的DateTime类型 DateTime dt=DateTime.Parse(DateTime.Now.ToString ...
- linux初学者-Apache篇
linux初学者-Apache篇 Apache提供了超文本传输协议http,httpd是Apache超文本传输协议的主服务器.下文将对httpd的安装和配置进行简单的叙述. ...
- Linux学习(一)--VMware下Linux安装和配置
本片随便将给大家讲述linux在VM虚拟机上安装及终端的安装和配置 一.Linux介绍 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线 ...
- JAVA 基于TCP协议的一对一,一对多文件传输实现
最近老师给我们上了多线程和TCP和UDP协议,其中一个要求就是我们用JAVA协议一个基于TCP和UDP这两种协议的一对一文件上传和一对多文件上传. 然后我就开始分析TCP和UDP这两个协议的特点,发现 ...
- 细说RESTFul API之版本管理
目录 接口实现版本管理的意义 如何实现接口的版本管理 项目实战 接口实现版本管理的意义 API版本管理的重要性不言而喻,对于API的设计者和使用者而言,版本管理都有着非常重要的意义. 首先,对于API ...
- SQL语句中的as
- Samba:打造企业级授权文件共享服务器
写在前面的话 先来说说故事背景:公司内部文件服务器的解决方案其实很多,对于中小型互联网公司,大多的在这一块的选型还是 FTP,或者 VSFTP,但是个人实在是对那个东西喜欢不起来,于是就选择了配置相对 ...
- javaweb入门--web是什么
WEB基本概念 首先明白web是什么,人们常说的web其实就是英文中页面的意思,准确来说是Internet主机供给外界访问的资源. 站在用户视角,也就是说,通过你浏览器(客户端)的地址栏输入资源(你要 ...
- CDN绕过姿势小结
公司的各业务主站都挂了CDN,总结一波CDN绕过技巧. 什么是CDN CDN的全称是Content Delivery Network,即内容分发网络. 其基本思路是尽可能避开互联网上有可能影响数据传输 ...