HDU_4251_The Famous ICPC Team Again(划分树)
来源:互联网 发布:jquery json数组遍历 编辑:程序博客网 时间:2024/06/06 20:02
题型:数据结构
题意:n个数,m次查询,每次查询区间的中位数。
分析:
赤果果的模板题,知道的就过,不知道的就只能喝茶了。
划分树,即求区间第K大数
代码:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;const int N = 123456;int n;int arr[N];//原数据,下标从 1 开始int sortedPos[N];//排序后int lfnum[32][N];//元素所在区间的当前位置进入左孩子的元素的个数int val[32][N];//记录第 k 层当前位置的元素的值bool cmp(const int &x,const int &y) { return arr[x]<arr[y];}void build(int l,int r,int d) { if(l==r) return; int mid=(l+r)>>1,p=0; for(int i=l; i<=r; i++) { if(val[d][i]<=mid) { val[d+1][l+p]=val[d][i]; lfnum[d][i]=++p; } else { lfnum[d][i]=p; val[d+1][mid+i+1-l-p]=val[d][i]; } } build(l,mid,d+1); build(mid+1,r,d+1);}//求区间[s,e]第 k 大的元素int query(int s,int e,int k,int l=1,int r=n,int d=0) { if(l==r) return l; int mid=(l+r)>>1,ss,ee; ss=(s==l?0:lfnum[d][s-1]); ee=lfnum[d][e]; if(ee-ss>=k) return query(l+ss,l+ee-1,k,l,mid,d+1); return query(mid+1+(s-l-ss),mid+1+(e-l-ee),k-(ee-ss),mid+1,r,d+1);}int main() { int cas=0,m,l,r,k; while(scanf("%d",&n)!=EOF) { for(int i=1; i<=n; i++) { scanf("%d",arr+i),sortedPos[i]=i; } sort(sortedPos+1,sortedPos+n+1,cmp); for(int i=1; i<=n; i++) { val[0][sortedPos[i]]=i; } build(1,n,0); printf("Case %d:\n",++cas); scanf("%d",&m); while(m--) { scanf("%d%d",&l,&r); k = (r-l+2)/2; printf("%d\n",arr[sortedPos[query(l,r,k)]]); } }}
0 0
- HDU_4251_The Famous ICPC Team Again(划分树)
- hdu 4251 The Famous ICPC Team Again--划分树
- HDU4251-The Famous ICPC Team Again(划分树)
- HDU:4251 The Famous ICPC Team Again(划分树)
- hdu 4251 The Famous ICPC Team Again(划分树)
- hdu4251The Famous ICPC Team Again【划分树入门题】
- hdu 4251 The Famous ICPC Team Again(划分树)
- HDU 4251 The Famous ICPC Team Again (划分树)
- HDU 4251The Famous ICPC Team Again 划分树
- HDU4251 The Famous ICPC Team Again(划分树裸)
- hdu 4251 The Famous ICPC Team Again(划分树)
- hdu 4251 The Famous ICPC Team Again (划分数)
- hdu 4251 The Famous ICPC Team Again(划分树裸题)
- HDOJ 题目4251The Famous ICPC Team Again(划分树)
- hud--4251The Famous ICPC Team Again+划分树入门题
- HDU 4251-The Famous ICPC Team Again(划分树-区间中位数)
- HDU 4251 The Famous ICPC Team Again 划分树 区间第K大
- hdoj_4251The Famous ICPC Team Again
- Struts2如何传值到jsp页面
- tomcat启动startup.bat一闪而过
- 学习笔记 较全的php数组操作方法
- PUTY使用详解
- crm操作商机实体
- HDU_4251_The Famous ICPC Team Again(划分树)
- vs 2008 之Stack overflow 堆栈溢出解决办法
- 用java实现简单的搜索引擎
- 黑马程序员-自己总结的winform常用控件(四)
- POJ1458 Common Subsequence 【最长公共子序列】
- 定时器UNIX crontab vs Quartz
- Exadata(测)
- 在 VS14 上安装 Visual F# Power Tools
- strcpy和memcpy的区别