Super Mario

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3625    Accepted Submission(s): 1660

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
Source
2012 ACM/ICPC Asia Regional Hangzhou Online
Recommend
liuyiding   |   We have carefully selected several similar problems for you:  5498 5497 5496 5495 5494
给你n个数,让你在一段区间之内求不大于k的值得数有多少个
解决方法:
原模板不动,额外再家一个函数,用二分的方法看mid值去多少的时候《=所给的值,不断的更新ans,最后的ans一定是最大的值
下面代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;const int MAXN=100010;
int tree[30][MAXN];//表示每层每个位置的值
int sorted[MAXN];//已经排序的数
int toleft[30][MAXN];//toleft[p][i]表示第i层从1到i有多少个数分入左边void build(int l,int r,int dep)
{if(l==r)return;int mid=(l+r)>>1;int same=mid-l+1;//表示等于中间值而且被分入左边的个数for(int i=l;i<=r;i++)if(tree[dep][i]<sorted[mid])same--;int lpos=l;int rpos=mid+1;for(int i=l;i<=r;i++){if(tree[dep][i]<sorted[mid])//比中间的数小,分入左边tree[dep+1][lpos++]=tree[dep][i];else if(tree[dep][i]==sorted[mid]&&same>0){tree[dep+1][lpos++]=tree[dep][i];same--;}else  //比中间值大分入右边tree[dep+1][rpos++]=tree[dep][i];toleft[dep][i]=toleft[dep][l-1]+lpos-l;//从1到i放左边的个数
}build(l,mid,dep+1);build(mid+1,r,dep+1);}//查询区间第k大的数,[L,R]是大区间,[l,r]是要查询的小区间
int query(int L,int R,int l,int r,int dep,int k)
{if(l==r)return tree[dep][l];int mid=(L+R)>>1;int cnt=toleft[dep][r]-toleft[dep][l-1];//[l,r]中位于左边的个数if(cnt>=k){//L+要查询的区间前被放在左边的个数int newl=L+toleft[dep][l-1]-toleft[dep][L-1];//左端点加上查询区间会被放在左边的个数int newr=newl+cnt-1;return query(L,mid,newl,newr,dep+1,k);}else{int newr=r+toleft[dep][R]-toleft[dep][r];int newl=newr-(r-l-cnt);return query(mid+1,R,newl,newr,dep+1,k-cnt);}
}
int n,m;
int ans;
void solve(int s,int t,int k){int l=1;int r=t-s+1;ans=0;while(l<=r){int mid=(l+r)>>1;int temp=query(1,n,s,t,0,mid);if(temp<=k){ans=mid;l=mid+1;}elser=mid-1;}printf("%d\n",ans);
}int main(){int T;int cas=1;int s,t,k;scanf("%d",&T);while(T--){memset(tree,0,sizeof(tree));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&tree[0][i]);sorted[i]=tree[0][i];}sort(sorted+1,sorted+n+1);build(1,n,0);printf("Case %d:\n",cas++);for(int i=1;i<=m;i++){scanf("%d%d%d",&s,&t,&k);s++;t++;solve(s,t,k);}}return 0;
}

转载于:https://www.cnblogs.com/13224ACMer/p/4866292.html

HDU 4417 Super Mario(划分树问题求不大于k的数有多少)相关推荐

  1. HDU 4417 Super Mario(划分树)

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

  2. hdu 4417 Super Mario 划分树+二分

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给定一个长度为n的序列,求区间[L,R]中小于h的个数: 思路: 分三种情况: 1:如果该区间最小 ...

  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(主席树/线段树+离线)

    题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...

  5. HDU 4417 Super Mario(线段树离线处理/主席树)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

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

    题目: Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded ...

  7. hdu 4417 Super Mario(可持久化线段树)

    题意:给你一些数,有多次询问,问你在l,r区间内小于k的数有多少个 思路:主席树大发好,虽然树状数组和线段树离线也可以做 代码: #include <set> #include <m ...

  8. HDU 4417 Super Mario

    划分树 + 二分 二分枚举第k小的数与h比较大小. #include <stdio.h> #include <string.h> #include <stdlib.h&g ...

  9. 【划分树+二分】HDU 4417 Super Mario

    第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

最新文章

  1. 最近python为什么这么火-现在为什么 Python 这么火?
  2. android 驻留广播,Android实现Service永久驻留
  3. c语言汉字属于什么类型_你知道你的身体属于什么类型么?
  4. Win10+vs2013+Caffe静态库配置自己的工程
  5. 脚手架工程:介绍安装
  6. envoy重试_具有Envoy代理的微服务模式,第二部分:超时和重试
  7. c语言int转字符串_C语言零基础入门-指针-05
  8. spring配置文件各个属性详解
  9. 数据库系统概论【设计与应用开发篇】
  10. 面试官问我 RabbitMQ 消息如何插队?
  11. worldpress php7.2,centos7.4下word press环境由php5.6.4升级到php7.2
  12. 天阳科技-宁波银行面试题【杭州多测师】【杭州多测师_王sir】
  13. rails开发利器:视频播放插件plugin(如何开发一个简单的插件)
  14. OpenGL风车项目
  15. mac夜神模拟器与mac数据共享设置
  16. 人工智能中的术语及缩略语
  17. android屏幕省电,AMOLED屏幕省电吗 AMOLED屏幕耗电测评测
  18. Linux常用命令——mv命令
  19. 故障分析 | 报错 ERROR 5270 -HY000-- object not in RECYCLE BIN 引发的几个思考
  20. OCR识别 云脉慧眼 CC慧眼 拍照翻译 拍照百度搜索

热门文章

  1. 信奥题库(OI题库)8月月赛T1题解 幂次数
  2. macbook 如何在开盖的情况下连接外接显示器, 同时 macbook 的键盘和触摸板都能工作
  3. new BigDecimal比较大小
  4. 消息模板占位符的使用
  5. php 多个curl 很慢,PHP下CURL异常慢
  6. 微分中值定理及其应用——(不定式极限洛必达法则)
  7. 入职两年涨薪3K被拒,平时好脸给多了?转身立马裸辞走人...
  8. java ogv格式_COMSOL Multiphysics
  9. TEST | 运用position:absolute做一张太极图
  10. 【转】4G手机打电话为什么会断网 4G上网和通话不能并存原因分析