poj2104[划分树问题]
来源:互联网 发布:以下哪件商品淘宝禁售 编辑:程序博客网 时间:2024/06/05 18:26
这个题目的意思是给你一个区间,让你找到在某个给出的子区间当中第k大的数。
这是我的第一个划分树题目,因为之前做了好多线段树的题目了,看了看书上基本的代码,然后按照自己的思路写了出来。
按照这个题目的思路,得用到二分,把给出的元素x[n]排好序y[n],对于一个给出的子区间,那么第k大的元素应该满足两点:
(1)在区间当中至少存在k个不超过第k大的元素
(2)在区间当中小于第k大的元素不到k个
从排好序列的区间当中取出mid,划分树当中每个节点保存的是一个区间内排好序的元素,当这个节点所在的区间完全包含在被给出的区间的时候,就找出小于等于y[mid]的元素的个数,每次查询完成以后得出小于等于y[mid]的元素的个数t,如果t>=k,就让right=mid,否则的话就让left=mid;这样二分可以很快找到满足条件的y[mid],最后输出的y[mid]就是查找到的区间当中的第k大的数
#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#define tag 1200#define maxn 100010using namespace std;int x[maxn];int y[maxn];vector<int>ve[4*maxn];void build(int now,int l,int r){ if (r==l) { ve[now].clear(); ve[now].push_back(x[l]); return ; } int mid=(l+r)>>1; build(2*now,l,mid); build(2*now+1,mid+1,r); ve[now].resize(r-l+1);//目的是申请足够容纳[l,r]内元素的内存单元 merge(ve[2*now].begin(),ve[2*now].end(),ve[2*now+1].begin(),ve[2*now+1].end(),ve[now].begin());//由下往上区间合并,合并的同时完成了排序}int query(int now,int l,int r,int tl,int tr,int val)//查询操作,关键地方{ if (tl>r||tr<l)return 0; if (tl<=l&&tr>=r) { int t=upper_bound(ve[now].begin(),ve[now].end(),val)-ve[now].begin(); return t; } else { int mid=(l+r)>>1; int t1=query(2*now,l,mid,tl,tr,val); int t2=query(2*now+1,mid+1,r,tl,tr,val); return t1+t2; }}int main(){ int n,m; int shu[5]={4,5,6,7,8}; while(cin>>n>>m) { for (int i=1;i<=n;i++) { scanf("%d",&x[i]); y[i]=x[i]; } sort(y+1,y+1+n); build(1,1,n); int l,r,val,mid; int sum; while(m--) { scanf("%d %d %d",&l,&r,&val); int left=0,right=n; while(right-left>1)//二分方法找到在[l,r]内的第k大的元素 { mid=(left+right)>>1; sum=y[mid]; int t=query(1,1,n,l,r,sum); if(t>=val) { right=mid; } else { left=mid; } } printf("%d\n",y[right]); } } return 0;}
0 0
- poj2104[划分树问题]
- poj2104 划分树
- poj2104(划分树)
- poj2104 hdu2665 划分树
- 划分树 poj2104 hdu5249
- 划分树 POJ2104
- 划分树(模板)poj2104
- poj2104||hdu2665 归并树|划分树
- POJ2104 POJ2761 K-th Number, 划分树
- 【划分树】K-th Number POJ2104 POJ2761
- poj2104 K-th Number(划分树)
- poj2104--K-th Number(划分树)
- (划分树)poj2104 K-th Number
- poj2104 K-th Number 主席树或划分树
- Hustoj (poj2104)线段树(划分树)
- POJ2104 K-th Number(划分树和主席树代码)
- poj2104——K-th Number(划分树)
- POJ2104 K-th Number (划分树模板)
- Neural Networks and Deep Learning CH4
- ios开发者如何获取iOS应用中所有图片资源
- ARM 构建交叉编译工具链
- 类初始化
- 图形界面编程(五) 布局容器类(3)
- poj2104[划分树问题]
- Harris角点标注法
- PHP扩展安装详解
- Collection List Set和Map用法与区别(转)
- fgets()函数输入的长度,以及strlen()函数返回的长度问题
- jsp页显示时间标签JSTL标签
- 类加载机制
- 设计模式——单例模式(创建型模式)
- input输入提示历史记录