HDU 4417 Super Mario(线段树)
Super Mario
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5370 Accepted Submission(s): 2461
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.
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.)
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
Case 1:
4
0
0
3
1
2
0
1
5
1可持久化线段树,求动态区间比某个值小的有几个。时间限制1秒,所以要离散化,否则会超时也会超内存#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <map> using namespace std;
typedef long long int LL;
const int maxn=1e5;
int l[maxn*18+5];
int r[maxn*18+5];
int rt[maxn+5];
int num[maxn*18+5];
int p;
int n,m;
int ll,rr;
LL H;
LL a[maxn+5];
LL b[maxn+5];
map<LL,int> mm;
int nownode()
{
l[p]=r[p]=0;
num[p]=0;
return p++;
}
void update(int &node,LL begin,LL end,LL tag)
{
if(!node) node=nownode();
else
{
num[p]=num[node];l[p]=l[node];
r[p]=r[node];node=p;
p++;
}
if(begin==end)
{
num[node]++;
return ;
}
LL mid=(begin+end)>>1;
if(tag<=mid) update(l[node],begin,mid,tag);
else update(r[node],mid+1,end,tag);
num[node]=num[l[node]]+num[r[node]];
}
int query(int node1,int node2,LL begin,LL end,LL tag) {
if(0<=begin&&end<=tag)
{
return num[node2]-num[node1];
}
LL mid=(begin+end)>>1;
if(tag<=mid) return query(l[node1],l[node2],begin,mid,tag);
else return num[l[node2]]-num[l[node1]]+query(r[node1],r[node2],mid+1,end,tag);
}
int bin(LL x)
{
int l=1;int r=n;
while(l<=r)
{
int mid=(l+r)>>1;
if(a[mid]<=x)
l=mid+1;
else
r=mid-1;
}
return r;
}
int main()
{
int t;
scanf("%d",&t);
LL len=1e9;
LL x;
int cas=0;
while(t--)
{
scanf("%d%d",&n,&m);
memset(rt,0,sizeof(rt));
memset(num,0,sizeof(num));
p=1;
for(int i=1;i<=n;i++)
{ scanf("%lld",&a[i]);
b[i]=a[i]; }
sort(a+1,a+n+1);
int tot=0;
mm.clear();
for(int i=1;i<=n;i++)
if(!mm[a[i]])
mm[a[i]]=tot++;
for(int i=1;i<=n;i++)
{
update(rt[i]=rt[i-1],0,maxn,mm[b[i]]);
}
printf("Case %d:\n",++cas);
for(int i=1;i<=m;i++)
{
scanf("%d%d%lld",&ll,&rr,&H);
int x=bin(H);
if(x==0) {printf("0\n");continue;}
ll++,rr++;
printf("%d\n",query(rt[ll-1],rt[rr],0,maxn,mm[a[x]]));
}
}
return 0;
}
HDU 4417 Super Mario(线段树)的更多相关文章
- HDU 4417 Super Mario(划分树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDOJ 4417 - Super Mario 线段树or树状数组离线处理..
题意: 同上 题解: 抓着这题作死的搞~~是因为今天练习赛的一道题.SPOJ KQUERY.直到我用最后一种树状数组通过了HDOJ这题后..交SPOJ的才没超时..看排名...时间能排到11名了..有 ...
- HDU 4417 Super Mario(划分树问题求不大于k的数有多少)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4417 Super Mario 主席树查询区间小于某个值的个数
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> ...
- HDU 4417 - Super Mario ( 划分树+二分 / 树状数组+离线处理+离散化)
题意:给一个数组,每次询问输出在区间[L,R]之间小于H的数字的个数. 此题可以使用划分树在线解决. 划分树可以快速查询区间第K小个数字.逆向思考,判断小于H的最大的一个数字是区间第几小数,即是答案. ...
- HDU 4417 Super Mario 主席树
分析:找一个区间里小于等于h的数量,然后这个题先离散化一下,很简单 然后我写这个题主要是熟悉一下主席树,其实这个题完全可以离线做,很简单 但是学了主席树以后,我发现,在线做,一样简单,而且不需要思考 ...
- HDU 4417 Super Mario ( 离线树状数组 )
把数值和查询放在一起从小到大排序,纪录每个数值的位置,当遇到数值时就更新到树状数组中,遇到查询就直接查询该区间和. #include <cstdio> #include <cstri ...
- HDU 4417 Super Mario(划分树+二分)
题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...
- hdu 4417 Super Mario 离线线段树
思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...
随机推荐
- Android_WebServices_源代码分析
本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/38037989 在Android_WebServices_介绍一文中, ...
- 0x00 译文:Windows桌面应用入门选择
当你想要创建一个新的桌面应用的时候,第一个你需要做的决定是使用Win32 和COM 还是使用.NET两个选项. C++ 和 Win32 使你“离奖牌更近”,并使你可以获得最佳的应用性能..NET 使你 ...
- js操作cookie的一些注意项
这两天做购物车逻辑.依照通常的做法,把预购信息存放在cookie里,结果发生了非常多不可理喻的事情,完整的证明了我对cookie的无知. . . 这么多年.非常少用cookie,由于认为它不安全 ...
- EXTI—外部中断/事件控制器
外部中断/事件控制器(EXTI)管理了控制器的 23 个中断/事件线.每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测. EXTI 可以实现对每个中断/事件线进行单独 ...
- sqlmap如何跑base64加密了的注入点
其实http://www.cnblogs.com/xishaonian/p/6276799.html这个就是一个案例了. 但是不得不重写一篇文章来记载.因为这是一个姿势.很好的姿势. 保存为xisha ...
- Odoo 8.0 new API 之model 装饰
model装饰器的作用是返回一个集合列表 应用举例: 定义columns langs = fields.Selection(string="Lang",selection=&quo ...
- strerror和perror函数详解
/*#include <string.h> char *strerror(int errnum); 它返回errnum的值所对应的错误提示信息,例如errnum等于12的话,它就会返回&q ...
- UCOS2系统内核讲述_总体描述
Ⅰ.写在前面 学习本文之前可以参考我前面基于STM32硬件平台移植UCOS2的几篇文章,我将其汇总在一起: UCOS2_STM32F1移植详细过程(汇总文章) 要想学习,或使用系统配套的资源(如:信号 ...
- MongoDB(一):关系型数据库和非关系型数据库
一.关系型数据库 1.概念 关系型数据库:是指采用了关系模型来组织数据的数据库,是目前各类数据库中使用最为广泛的数据库系统.简单的说,关系模型指的就是二维表格模型,一个关系型数据库就是由二维表及其之间 ...
- Entity Framework中的实体类添加复合主键
使用Code First模式实现给实体类添加复合主键,代码如下: using System; using System.Collections.Generic; using System.Compon ...