题目链接:点击查看

题目大意:给出一个数列,然后是m次查询,每次查询闭区间[l,r]内第K大的数

题目分析:裸的主席树,暑假集训第三周的时候就听说过了这个数据结构,不过当时太懒了,而且那些主席树的问题都能用线段树离线处理,就没花功夫来学,今天遇到的这个题,本来也想用线段树离线处理,但是发现用vector会超时,看网上的题解是要用二分优化,但我不太理解为什么要那样二分,所以就来学一学这个高级数据结构了,大概前前后后花了一天时间,看懂原理+背模板+理解细节,现在也刚停留在基础部分吧。。还是需要多刷点题才能培养出举一反三的能力,这里留一个B站视频,我感觉讲的挺好的:

av4619406

然后还有一个大佬的博客,也是当时看过之后一个小细节突然豁然开朗:

点击查看

直接就上代码了,现在就剩一个小细节不太明白了,先背过,以后说不定就理解了呢

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;vector<int>v;struct Node
{int l,r;int sum;
}tree[N*20];int cnt,root[N];void init()
{root[0]=0;tree[0].l=tree[0].r=tree[0].sum=0;cnt=1;
}void update(int num,int &k,int l,int r)
{tree[cnt++]=tree[k];k=cnt-1;tree[k].sum++;if(l==r)return;int mid=l+r>>1;if(num<=mid)update(num,tree[k].l,l,mid);elseupdate(num,tree[k].r,mid+1,r);
}int a[N];int query(int i,int j,int k,int l,int r)//i:左端点根节点编号,j:右端点根节点编号,k:第k大的数,l,r:区间[l,r]
{int d=tree[tree[j].l].sum-tree[tree[i].l].sum;//i和j代表的是根节点的编号,tree[i].l和tree[j].l代表的是根节点左子区间的编号
//tree[tree[j].l].sum和tree[tree[i].l].sum代表的是根节点左子区间的数目和,做差表示的是i到j这段区间内的左子区间的数目和(类比于前缀和)
//这时d代表的是左子区间的数目和if(l==r)//遍历到叶子节点,返回节点位置return l;int mid=l+r>>1;if(k<=d)//如果左子区间的数目和比要求的K大,那么第K大的数一定在左子区间,遍历左子区间return query(tree[i].l,tree[j].l,k,l,mid);else//上述条件不成立,那么第K大的数一定在右子区间,遍历右子区间return query(tree[i].r,tree[j].r,k-d,mid+1,r);
}int main()
{
//  freopen("input.txt","r",stdin);int n,m;while(scanf("%d%d",&n,&m)!=EOF){v.clear();for(int i=1;i<=n;i++){scanf("%d",a+i);v.push_back(a[i]);}init();sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());for(int i=1;i<=n;i++){root[i]=root[i-1];int num=lower_bound(v.begin(),v.end(),a[i])-v.begin()+1;update(num,root[i],1,n);}while(m--){int x,y,z;scanf("%d%d%d",&x,&y,&z);printf("%d\n",v[query(root[x-1],root[y],z,1,n)-1]);}}return 0;
}

POJ - 2104 K-th Number(主席树)相关推荐

  1. poj2104 k-th number 主席树入门讲解

    poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树   刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...

  2. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

  3. K-th Closest Distance HDU - 6621(第k小绝对值+主席树+二分)

    You have an array: a1, a2, , an and you must answer for some queries. For each query, you are given ...

  4. 【HDU - 2665】Kth number(区间第K大,主席树,模板)

    题干: Give you a sequence and ask you the kth big number of a inteval. Input The first line is the num ...

  5. 主席树学习小结(POJ 2104)

    在高中的时候就听到过主席树了,感觉非常高端,在寒假的时候 winter homework中有一题是查找区间第K大的树,当时就开始百度这种网上的博客,发现主席树看不懂,因为那个root[i],还有tx[ ...

  6. 主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间=k的个数)...

    取板粗   好东西来的 1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid=2665 (POJ2104)http://poj.org/probl ...

  7. HDU 4417 Super Mario(线段树离线处理/主席树)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  8. SPOJ COT Count on a tree(主席树+倍增lca)

    思路:这个题其实就是树上的第k小,主席树的本质还是类似于前缀和一样的结构,所以是完全相同的,所以我们在树上也可以用同样的方法,我们对于每一个节点进行建树,然后和普通的树上相同,ab之间的距离是等于 r ...

  9. poj 2104: K-th Number 【主席树】

    题目链接 学习了一下主席树,感觉具体算法思路不大好讲.. 大概是先建个空线段树,然后类似于递推,每一个都在前一个"历史版本"的基础上建立一个新的"历史版本",每 ...

最新文章

  1. python资本市场财务数据分析_Python对股票财务数据进行可视化分析
  2. ZooKeeper伪分布式集群安装
  3. 深度学习中常用的激活函数详解及对比分析(sigmoid)
  4. 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)
  5. 类的定义、成员定义修饰符
  6. mysql叶子结点存储的什么_B+树叶子结点到底存储了什么?
  7. HTML5 — 知识总结篇《IV》【实体字符】
  8. Xcode连接git@osc
  9. Java小白学习指南【day43】---Linux
  10. rdkitpython | 通过反应获得断键位点与类型
  11. 数字电视加密技术工作原理(EMM ECM)
  12. 三星 OMNIA7/I8700 刷机 ROM集合
  13. EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE
  14. PADS如何导入DXF文件
  15. 够哦了下攻击力开房间的发的goole
  16. Kali安装的一些常用软件
  17. 面试的时候面试官问如何看待加班,该怎么回答?
  18. 科技圈最具权势25大女工程师
  19. JAVA复健篇01_基本概念
  20. TCP传输连接--建立连接阶段(TCP三次握手)

热门文章

  1. SpringSecurity案例之把资源交给OAuth2的资源服务管理
  2. RabbitMQ direct交换机
  3. RabbitMQ队列持久化
  4. synchronized的用法
  5. MySQL 的发展历史和版本分支:
  6. Redis中的Sentinel故障转移
  7. Bean实例化三种方式
  8. 消息发送样例介绍和步骤分析
  9. OAuth2.0授权码认证流程介绍
  10. 绕过网关访问图片上传并解决跨域问题