HDU 4417 Super Mario(划分树问题求不大于k的数有多少)
Super Mario
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3625 Accepted Submission(s): 1660
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.)
#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的数有多少)相关推荐
- HDU 4417 Super Mario(划分树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 4417 Super Mario 划分树+二分
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给定一个长度为n的序列,求区间[L,R]中小于h的个数: 思路: 分三种情况: 1:如果该区间最小 ...
- #HDU 4417 Super Mario (主席树 + 二分)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU - 4417 Super Mario(主席树/线段树+离线)
题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...
- HDU 4417 Super Mario(线段树离线处理/主席树)
Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...
- HDU 4417 Super Mario(离线 + 树状数组)
题目: Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded ...
- hdu 4417 Super Mario(可持久化线段树)
题意:给你一些数,有多次询问,问你在l,r区间内小于k的数有多少个 思路:主席树大发好,虽然树状数组和线段树离线也可以做 代码: #include <set> #include <m ...
- HDU 4417 Super Mario
划分树 + 二分 二分枚举第k小的数与h比较大小. #include <stdio.h> #include <string.h> #include <stdlib.h&g ...
- 【划分树+二分】HDU 4417 Super Mario
第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...
最新文章
- 最近python为什么这么火-现在为什么 Python 这么火?
- android 驻留广播,Android实现Service永久驻留
- c语言汉字属于什么类型_你知道你的身体属于什么类型么?
- Win10+vs2013+Caffe静态库配置自己的工程
- 脚手架工程:介绍安装
- envoy重试_具有Envoy代理的微服务模式,第二部分:超时和重试
- c语言int转字符串_C语言零基础入门-指针-05
- spring配置文件各个属性详解
- 数据库系统概论【设计与应用开发篇】
- 面试官问我 RabbitMQ 消息如何插队?
- worldpress php7.2,centos7.4下word press环境由php5.6.4升级到php7.2
- 天阳科技-宁波银行面试题【杭州多测师】【杭州多测师_王sir】
- rails开发利器:视频播放插件plugin(如何开发一个简单的插件)
- OpenGL风车项目
- mac夜神模拟器与mac数据共享设置
- 人工智能中的术语及缩略语
- android屏幕省电,AMOLED屏幕省电吗 AMOLED屏幕耗电测评测
- Linux常用命令——mv命令
- 故障分析 | 报错 ERROR 5270 -HY000-- object not in RECYCLE BIN 引发的几个思考
- OCR识别 云脉慧眼 CC慧眼 拍照翻译 拍照百度搜索
热门文章
- 信奥题库(OI题库)8月月赛T1题解 幂次数
- macbook 如何在开盖的情况下连接外接显示器, 同时 macbook 的键盘和触摸板都能工作
- new BigDecimal比较大小
- 消息模板占位符的使用
- php 多个curl 很慢,PHP下CURL异常慢
- 微分中值定理及其应用——(不定式极限洛必达法则)
- 入职两年涨薪3K被拒,平时好脸给多了?转身立马裸辞走人...
- java ogv格式_COMSOL Multiphysics
- TEST | 运用position:absolute做一张太极图
- 【转】4G手机打电话为什么会断网 4G上网和通话不能并存原因分析