poj 2104
来源:互联网 发布:浙江古镇旅游攻略 知乎 编辑:程序博客网 时间:2024/06/08 03:59
给定一个区间[l,r],求这个区间的第k大的数是多。
划分树的模板题,讲解见:http://blog.csdn.net/u013983192/article/details/39051671
代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAX 101000#define MID(a,b) (a+((b-a)>>1))int n,m;int sorted[MAX];struct ptree{ int val[MAX]; int num[MAX];};ptree tree[20];void build_tree(int l,int r,int p){ int i,j; if(l==r) return ; int mid=MID(l,r); int lsame=mid-l+1,same=0,ln=l,rn=mid+1; for(i=l;i<=r;i++) if(tree[p].val[i]<sorted[mid]) lsame--; for(i=l;i<=r;i++) { if(i==l) tree[p].num[i]=0; else tree[p].num[i]=tree[p].num[i-1]; if(tree[p].val[i]<sorted[mid]) { tree[p].num[i]++; tree[p+1].val[ln++]=tree[p].val[i]; } else if(tree[p].val[i]>sorted[mid]) { tree[p+1].val[rn++]=tree[p].val[i]; } else { same++; if(lsame>=same) { tree[p].num[i]++; tree[p+1].val[ln++]=tree[p].val[i]; } else { tree[p+1].val[rn++]=tree[p].val[i]; } } } build_tree(l,mid,p+1); build_tree(mid+1,r,p+1);}int query(int l,int r,int left,int right,int k,int p){ if(left==right) return tree[p].val[left]; int mid=MID(left,right); int lx,ly,rx,ry; /* lx表示从lft到st-1这段区间内有多少个数进入左子树 ly表示从st到ed这段区间内有多少个数进入左子树 rx表示从lft到st-1这段区间内有多少个数进入右子树 ry表示从st到ed这段区间内有多少个数进入右子树 */ if(l==left) { lx=0;ly=tree[p].num[r]; } else{ lx=tree[p].num[l-1];ly=tree[p].num[r]-lx; } if(k<=ly) { l=left+lx; r=left+lx+ly-1; return query(l,r,left,mid,k,p+1); } else { rx=l-left-lx; ry=r-l+1-ly; l=mid+rx+1; r=mid+rx+ry; return query(l,r,mid+1,right,k-ly,p+1); }}int main(){ int i,j; int L,R,k; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++) {scanf("%d",&tree[0].val[i]);sorted[i]=tree[0].val[i];} sort(sorted+1,sorted+n+1); build_tree(1,n,0); for(i=1;i<=m;i++) { scanf("%d%d%d",&L,&R,&k); printf("%d\n",query(L,R,1,n,k,0)); } } return 0;}
0 0
- POJ 2104
- poj 2104
- poj 2104
- poj 2104
- POJ 2104
- POJ 2104 划分树
- [划分树] poj 2104
- poj 2104 归并树
- poj 2104 划分树
- POJ 2104 划分树
- 划分树 poj 2104
- poj 2104(划分树)
- poj 2104 划分树
- POJ 2104 解题报告
- poj 2104 Drying
- POJ 2104【整体二分】
- POJ 2104 划分树
- poj-2104【构造】
- maven 环境搭建 Myeclipse配置
- ASP.NET 中后台代码中全局变量在提交多少后一直保存起来的3种方式
- 忍耐是一种美德等待脚本和Visual Web开膛手
- 人身伤害律师洛杉矶 - 正是这样成本均也正因如此,它的
- Linux 容器相关的2个重要概念
- poj 2104
- 人行横道作出了应用搜索过程中容易在iOS
- B. Appleman and Card Game
- java 获取文件中数据的条数
- 爲什麼要寫技術博
- 人才管理的催化剂。您的成功
- IOS常见知识点
- 模式对话框与非模式对话框的区别
- Codeforces Round #210 (Div. 1) C. Levko and Strings