Super Mario

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 32768/32768 K (Java/Others)

Problem Description

Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory. Now the poor princess is in trouble again and Mario needs to save his lover. We regard the road to the boss’s castle as a line (the length is n), on every integer point i there is a brick on height hi. Now the question is how many bricks in [L, R] Mario can hit if the maximal height he can jump is H.

Input

The first line follows an integer T, the number of test data.

For each test data:

The first line contains two integers n, m (1 <= n <=10^5, 1 <= m <= 10^5), n is the length of the road, m is the number of queries.

Next line contains n integers, the height of each brick, the range is [0, 1000000000].

Next m lines, each line contains three integers L, R,H.( 0 <= L <= R < n 0 <= H <= 1000000000.)

Output

For each case, output “Case X: ” (X is the case number starting from 1) followed by m lines, each line contains an integer. The ith integer is the number of bricks Mario can hit for the ith query.

Sample Input

1

10 10

0 5 2 7 5 4 3 8 7 7

2 8 6

3 5 0

1 3 1

1 9 4

0 1 0

3 5 5

5 5 1

4 6 3

1 5 7

5 7 3

Sample Output

Case 1:

4

0

0

3

1

2

0

1

5

1


解题心得:

  1. 题意就是有n个水管,每个水管都有高度,马里奥要从水管a走到水管b,此时马里奥能跨过的高度为h,问你在区间[a,b]之间水管高度不大于h的有多少个。
  2. 这个题一看就知道是线段树,但是线段树每一个节点记录的状态肯定不能记录多个高度的数量。很容易想到解决办法,没办法记录多个高度,那就从低的高度开始累加,所以在面对询问的时候将询问按照高度排序,在询问之前更新数量,插入不大于当前询问高度的水管,然后每次用线段树记录当前答案存下来,然后再按照之前询问的顺序输出就行了。
  3. 为了不TLE,要记录水管的位置,然后排序,按照顺序插入。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<string>
using namespace std;
const int maxn = 1e5+100;
struct tree {
int cnt,l,r;
}node[maxn<<2]; struct Brick{
int va,pos;
friend bool operator < (const Brick a, const Brick b){
return a.va < b.va;
}
}brick[maxn]; int n,m,ans[maxn]; struct Query{
int l,r,h,pos;
} qu[maxn]; bool cmp(Query a,Query b){
return a.h < b.h;
} void init(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&brick[i].va);
brick[i].pos = i;
}
for(int i=0;i<m;i++){
scanf("%d%d%d",&qu[i].l,&qu[i].r,&qu[i].h);
qu[i].pos = i;
}
sort(brick,brick+n);//水管排序
sort(qu,qu+m,cmp);//询问排序
} void build(int root,int l,int r){
node[root].cnt = 0;
node[root].l = l;
node[root].r = r;
if(l == r)
return ;
int mid = (l+r) >> 1;
build(root<<1,l,mid);
build(root<<1|1,mid+1,r);
} void insert_tree(int pos,int root,int l,int r){
node[root].cnt++;
if(l == r)
return ;
int mid = (l+r)>>1;
if(mid < pos)
insert_tree(pos,root<<1|1,mid+1,r);
else
insert_tree(pos,root<<1,l,mid);
} int query(int l,int r,int root,int L,int R){
if(l == L && r == R)
return node[root].cnt;
int mid = (L + R)>>1;
if(mid >= r)
return query(l,r,root<<1,L,mid);
else if(mid < l)
return query(l,r,root<<1|1,mid+1,R);
else
return query(l,mid,root<<1,L,mid) + query(mid+1,r,root<<1|1,mid+1,R);
} void get_ans(){
int k = 0;
for(int i=0;i<m;i++){
while(k<n){
if(brick[k].va <= qu[i].h){
insert_tree(brick[k].pos,1,0,n-1);//先插入
k++;
}
else
break;
}
int Ans = query(qu[i].l,qu[i].r,1,0,n-1);//再询问
ans[qu[i].pos] = Ans;//把答案给记录下来
}
} void Print(){
for(int i=0;i<m;i++)
printf("%d\n",ans[i]);
} int main(){
int t,T = 1;
scanf("%d",&t);
while(t--){
printf("Case %d:\n",T++);
init();
build(1,0,n-1);
get_ans();
Print();
}
return 0;
}

HDU:4417-Super Mario(离线线段树)的更多相关文章

  1. hdu 4417 Super Mario 离线线段树

    思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...

  2. HDU 4417 Super Mario(线段树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. HDU 4417 Super Mario (划分树)(二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. HDU 4417 Super Mario ( 离线树状数组 )

    把数值和查询放在一起从小到大排序,纪录每个数值的位置,当遇到数值时就更新到树状数组中,遇到查询就直接查询该区间和. #include <cstdio> #include <cstri ...

  7. hdu 4417 Super Mario (主席树)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给你段长为n的序列,有q个询问,每次询问区间[l.r]内有多少个数小于等于k 思路: 之前用 ...

  8. HDU 4417 Super Mario(主席树 区间不超过k的个数)题解

    题意:问区间内不超过k的个数 思路:显然主席树,把所有的值离散化一下,然后主席树求一下小于等于k有几个就行.注意,他给你的k不一定包含在数组里,所以问题中的询问一起离散化. 代码: #include& ...

  9. HDU 5700 区间交 离线线段树

    区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...

  10. HDU 4417 Super Mario(2012杭州网络赛 H 离线线段树)

    突然想到的节约时间的方法,感觉6翻了  给你n个数字,接着m个询问.每次问你一段区间内不大于某个数字(不一定是给你的数字)的个数 直接线段树没法做,因为每次给你的数字不一样,父节点无法统计.但是离线一 ...

随机推荐

  1. [Windows] 一些简单的CMD命令

    开始菜单中的“运行”是通向程序的快捷途径,输入特定的命令后,即可快速的打开Windows搜索的大部分程序,熟练的运用它,将给我们的操作带来诸多便捷. winver 检查Windows版本 wmimgm ...

  2. Mercurial(HG) Windows+Eclipse安装、配置、使用

    Mercurial(HG) Windows客户端安装 Mercurial(HG): http://mercurial.selenic.com/ Windows客户端下载:http://mercuria ...

  3. sqlserver2008执行200M以上的大脚本文件,打开脚本总是报“未能完成操作,存储空间不足”

    用sqlcmd命令行工具. 1.win7下快捷键:win+R 2.输入cmd​,确定 3.输入命令:sqlcmd -S <数据库> -i C:\<数据文件>.sql 例:sql ...

  4. iOS开发ReactiveCocoa学习笔记(五)

    ReactiveCocoa常见操作方法介绍: demo地址:https://github.com/SummerHH/ReactiveCocoa.git filter ignore ignoreValu ...

  5. js之BOM和DOM

      今天我们来学习js中的一些基础的操作. 一.BOM对象 BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其他与页面内容不直接相 ...

  6. 从零开始的全栈工程师——js篇2.4

    条件语句与循环语句 变量提升: 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域叫window ,window分两个模块,一个叫内存模块,一个叫运行模块,内存模块找到当前作 ...

  7. Django--对表的操作

    一丶多表创建 1.创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之 ...

  8. windows环境下Nginx部署及Https设置

    一.Nginx安装部署及常用命令. 1.1.其实Nginx是免安装的.直接在官网下载zip包,解压即可,下载地址:http://nginx.org/en/download.html,因为我这边的开发服 ...

  9. linux命令 ——目录

    开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列为每天一个linux命令.学习的主要参考资料为: 1.<鸟哥的linux私房菜> 2.http://codingstan ...

  10. Centos7安装 PostgreSQL步骤

    1. 安装服务器即可. Yum install postgresql-server Yum install postgresql-contrib 2. 验证是否安装成功: rpm -aq| grep ...