普通线段树的叶子节点(最下面一层,从左到右的编号i依次是1,2,3..n)记录的是a[i],即给定的序列值

权值线段树的叶子节点i对应的cnt[i]记录的是序列去重后第i小的数出现的次数,对于给定的序列需要离散化确定大小

如序列:[1,1,2,3,3,4,4,4,4,5],对应的权值线段树为:

图中第二层的9表示序列中的前9小的数都在上一个节点的左子树,1表示第9+1-第10小的数都在上一个节点的右子树,其他同理。

(图源https://blog.csdn.net/Stupid_Turtle/article/details/80445998)


权值线段树法:(整体二分查找)

测试样例:

7
3 3 2 1 5 5 7

#include <bits/stdc++.h>
using namespace std;
const int maxn = 300005;
int a[maxn], b[maxn], cnt[maxn];
void update(int id )
{cnt[id] = cnt[id << 1] + cnt[id << 1 | 1];
}
void build(int l, int r, int id, int no)
{if(l == r){cnt[id]++;return ;}int mid = (l + r) >> 1;if(no <= mid) build(l, mid, id << 1, no);// 单点else build(mid + 1, r, id << 1 | 1, no);update(id);
}
int query(int l, int r, int id, int k)
{if(l == r){return l; //返回1-n的第k大的数是去重之后的第几大数}int mid = (l + r) >> 1;if(k <= cnt[id << 1])query(l, mid, id << 1, k);else query(mid + 1, r, id << 1 | 1, k - cnt[id << 1]);//!k - cnt[id << 1]
}
int main()
{freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);int n;cin >> n;for(int i = 1; i <= n; i++){cin >> a[i];b[i] = a[i];}sort(a + 1, a + 1 + n);int m = unique(a+1, a+1+n) - (a+1);for(int i = 1; i <= n; i++){int no = lower_bound(a+1, a+1+m, b[i]) - a; //去重后第几大build(1, n, 1, no);}for(int i = 1; i <= n; i++){int id = query(1, n, 1, i);cout << a[id] << endl;}return 0;
}

离散化法:直接copy过来了,懒得改了。

#include <iostream>
#include <string.h>
#include <map>
#define maxn 1005
using namespace std;
struct node{int x,id;//id表示输出时的顺序friend bool operator <(node a,node b){return a.x<b.x;//升序}
}a[maxn],b[maxn];
int main()
{int n,rank[maxn];cin>>n;for(int i=1;i<=n;i++){scanf("%d",&a[i].x);a[i].id=i;}//可以用b数组存初始的a数组/*memcpy(b,a,sizeof(a));for(int i=1;i<=n;i++)cout<<b[i].x<<" ";cout<<endl;*/sort(a+1,a+1+n);for(int i=1;i<=n;i++){rank[a[i].id]=i;cout<<a[i].x<<" "<<i<<endl;}return 0;
}

【算法笔记】求给定序列的第k大(权值线段树/直接离散化)相关推荐

  1. 算法12--topK求一个数组中第k大的数

    求一个数组中第k大的值 解法一: 建立一个k个元素的最大堆,首先将数组中前k个元素放入堆中,此时堆顶元素为第k大的元素,后面继续遍历数组,比较堆顶元素与数组中元素值,当数组中元素小于堆顶元素时,将堆顶 ...

  2. codevs1688 求逆序对(权值线段树)

    1688 求逆序对  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果 题目描述 Description 给定一个序列a1,a2,-,an,如 ...

  3. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

  4. 刷题总结——序列操作(权值线段树套树状数组)

    题目: 题目描述 给出序列 a1,a2,-,an(0≤ai≤109),有关序列的两种操作. 1. ai(1≤i≤n)变成 x(0≤x≤109). 2. 求 al,al+1,-,ar(1≤l≤r≤n)第 ...

  5. 花匠(最长波浪子序列——DP + 权值线段树)

    题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体而 ...

  6. 【BZOJ3110】【codevs1616】K大数查询,权值线段树套普通线段树

    Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 思路: 之前没怎么接触过权值线段树(非主席树),这次就当学习了一下吧.一开始还把题意理解错了,我的 ...

  7. 【BZOJ2653】middle,主席树(非权值线段树)维护序列和信息+二分答案

    传送门 写在前面:虽然这是一道我再也不想写的题目,但很好很有价值 思路: cxlove大神: 要求中位数最大,首先二分中位数,然后判断可行不可行. 判断X可行不可行,对于区间内的数,凡是>=X的 ...

  8. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

  9. 动态区间第k小:树状数组套权值线段树

    所谓树状数组套权值线段树,就是在树状树组上套权值线段树 (逃) 解析 如何解决静态区间第k小? 使用主席树就ok啦 辣么如何解决动态区间第k小嘞- 我们想想主席树为啥不能解决动态区间第k小 因为如果改 ...

  10. 求序列中第k大的元素(划分树模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=4251 n个数,求给定区间中间大小的元素的值 Sample Input 5 5 3 2 4 1 3 1 3 2 4 ...

最新文章

  1. 从DDD看企业级问题解决方案框架
  2. MYSQL 的 MASTER到MASTER的主主循环同步
  3. 如何让JAVA程序实现一段时间等待
  4. mysql在线开启并行复制_mysql 5.7开启并行复制
  5. 什么是指利用计算机和现代,现代计算机一般指什么计算机?
  6. 免堆期由谁申请_谈谈离婚冷静期
  7. jquery插件开发方法
  8. Access中的模糊查询
  9. Hyper-V网络虚拟化--VM之间拷贝速度慢
  10. Codeforces Manthan, Codefest 18 (rated, Div. 1 + Div. 2) E.Trips
  11. css3 clac函数的易错整理
  12. USB-PPI数据电缆驱动
  13. 程序员除了代码,连数字都神神秘秘的
  14. java swing 聊天表情功能的实现(带完整代码)
  15. 在线阅读.epub文件的网站
  16. SublimeText 3.2.3207 汉化破解免安装版(3264位)
  17. 【已解决】群晖套件中心无法添加第三方源
  18. cgb2108-day02
  19. 微信小程序实现预览图片
  20. 辽宁工业大学计算机专业分数线,2019辽宁工业大学录取分数线及历年专业分数线统计表【文科 理科】...

热门文章

  1. 蓝桥杯 振兴中华——2013年省赛C/C++ A组真题3
  2. 剑指_3.1数组中重复的数字(Python/C++)
  3. 在线切换主题颜色无效_HeyUI组件库 | 如何实现在线切换主题
  4. opencv获取mat的指针_opencv中Mat类型数据操作与遍历
  5. mysql 联合索引底层结构_MySQL联合索引底层数据结构
  6. win nginx html 配置,Windows服务器nginx安装与配置
  7. C++ 对Ctrl+Z的解释
  8. WPF 使用值转换器进行绑定数据的转换IValueConverter
  9. MySQL移动数据目录出现权限问题
  10. Jquery实现滚动到底部加载更多(最原始)