HDOJ题目4417 Super Mario(划分树求区间比k小的个数+二分)
来源:互联网 发布:知乎 搞笑 编辑:程序博客网 时间:2024/06/07 08:11
Super Mario
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3313 Accepted Submission(s): 1548
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.)
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
110 100 5 2 7 5 4 3 8 7 7 2 8 63 5 01 3 11 9 40 1 03 5 55 5 14 6 31 5 75 7 3
Sample Output
Case 1:4003120151
Source
2012 ACM/ICPC Asia Regional Hangzhou Online
Recommend
liuyiding | We have carefully selected several similar problems for you: 5363 5362 5361 5360 5359
ac代码
#include<stdio.h>#include<string.h>#include<stdlib.h> int tree[30][100100],toleft[30][100100]; int sorted[100100]; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } void build(int l,int r,int dep) { if(l==r) return; int mid=(l+r)>>1; int same=mid-l+1; int i; int lpos=l; int rpos=mid+1; for(i=l;i<=r;i++) { if(tree[dep][i]<sorted[mid]) same--; } for(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; } build(l,mid,dep+1); build(mid+1,r,dep+1); } 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]; if(cnt>=k) { 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 main(){int t,c=0;scanf("%d",&t);while(t--){int n,m;while(scanf("%d%d",&n,&m)!=EOF){int i;for(i=1;i<=n;i++){scanf("%d",&tree[0][i]);sorted[i]=tree[0][i];}qsort(sorted+1,n,sizeof(sorted[1]),cmp);build(1,n,0);printf("Case %d:\n",++c);while(m--){int a,b,h;scanf("%d%d%d",&a,&b,&h);a++;b++;int l=1,r=(b-a)+1;int ans=0;while(l<=r){int mid=(l+r)>>1;int temp=query(1,n,a,b,0,mid);if(temp<=h){ans=mid;l=mid+1;}elser=mid-1;}printf("%d\n",ans);}}}}
0 0
- HDOJ题目4417 Super Mario(划分树求区间比k小的个数+二分)
- HDU 4417 - Super Mario (求区间小于h的数 划分树 二分 线段树 树状数组)
- hdu 4417 Super Mario (二分法 + 划分树求区间第K大)
- HDU 4417 Super Mario (主席树,区间小于k的个数)
- hdu-4417-Super Mario(无修改的主席树-求小于等于k的个数)
- hdu 4417 Super Mario--二分--划分树
- HDU 4417 Super Mario(划分树+二分)
- HDU-4417-Super Mario(划分树+二分)
- 【划分树+二分】HDU 4417 Super Mario
- HDU 4417Super Mario 划分树 + 二分
- HDU 4417 Super Mario 划分树+二分
- HDU-4417 Super Mario,划分树+二分!
- HDU4417 Super Mario(划分树+二分)
- 【HDU】4417 Super Mario(划分树+二分)
- HDU 4417 Super Mario(划分树+二分)
- hdu 4417 Super Mario(查找区间不大于h的数有多少个)(线段树+二分查找,划分树+二分查找)
- HDOJ 4417 - Super Mario 划分树成熟模板(可解决相同元素)+二分
- hdu 4417 Super Mario (划分树)
- iOS开发之解析XML格式数据
- hdu 1312 Red and Black(DFS)
- 九度OJ 题目1033:继续xxx定律
- JS和C语言判断闰年
- 范师兄的面经
- HDOJ题目4417 Super Mario(划分树求区间比k小的个数+二分)
- 函数实现不放在头文件的原因,及何时可以放头文件的情况
- 【android】利用getViewTreeObserver().addOnGlobalLayoutListener()获得一个视图的高度
- Qt的学习记录卡
- Linux最常用的20条命令
- MySQL中的数据类型
- 学生管理系统
- 学习BLAS库 -- DDOT
- ubuntu12.04下安装QT