[poj 2104]主席树+静态区间第k大
题目链接:http://poj.org/problem?id=2104
主席树入门题目,主席树其实就是可持久化权值线段树,rt[i]维护了前i个数中第i大(小)的数出现次数的信息,通过查询两棵树的差即可得到第k大(小)元素。
- #include<cstdio>
- #include<vector>
- #include<algorithm>
- using namespace std;
- #define lson(i) node[i].lson
- #define rson(i) node[i].rson
- const int maxn=;
- int rt[maxn];
- struct Node
- {
- int lson,rson,val;
- }node[maxn*];
- int tot;
- void push_up(int i)
- {
- node[i].val=node[lson(i)].val+node[rson(i)].val;
- }
- int build(int l,int r)
- {
- int i=++tot;
- if (l==r) node[i].val=;
- else
- {
- int mid=(l+r)/;
- lson(i)=build(l,mid);
- rson(i)=build(mid+,r);
- push_up(i);
- }
- return i;
- }
- int rebuild(int k,int x,int i,int nowl,int nowr)
- {
- int th=++tot;
- lson(th)=lson(i);
- rson(th)=rson(i);
- node[th].val=node[i].val;
- if (nowl==nowr) node[th].val+=x;
- else
- {
- int mid=(nowl+nowr)/;
- if (k<=mid) node[th].lson=rebuild(k,x,lson(i),nowl,mid);
- else node[th].rson=rebuild(k,x,rson(i),mid+,nowr);
- push_up(th);
- }
- return th;
- }
- int query(int rt1,int rt2,int k,int nowl,int nowr)
- {
- if (nowl==nowr) return nowl;
- int left=node[lson(rt2)].val-node[lson(rt1)].val;
- int mid=(nowl+nowr)/;
- if (left>=k) return query(lson(rt1),lson(rt2),k,nowl,mid);
- else return query(rson(rt1),rson(rt2),k-left,mid+,nowr);
- }
- int a[maxn];
- vector<int> ls;
- int main()
- {
- int n,m;
- scanf("%d%d",&n,&m);
- for (int i=;i<=n;i++) scanf("%d",&a[i]);
- ls.clear();
- for (int i=;i<=n;i++) ls.push_back(a[i]);
- sort(ls.begin(),ls.end());
- ls.erase(unique(ls.begin(),ls.end()),ls.end());
- rt[]=build(,n);
- for (int i=;i<=n;i++)
- {
- int j=lower_bound(ls.begin(),ls.end(),a[i])-ls.begin();
- rt[i]=rebuild(j+,,rt[i-],,n);
- }
- for (int i=;i<=m;i++)
- {
- int l,r,k;
- scanf("%d%d%d",&l,&r,&k);
- printf("%d\n",ls[query(rt[l-],rt[r],k,,n)-]);
- }
- return ;
- }
[poj 2104]主席树+静态区间第k大的更多相关文章
- poj 2104 主席树(区间第k大)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44940 Accepted: 14946 Ca ...
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- HDU 2665 Kth number(主席树静态区间第K大)题解
题意:问你区间第k大是谁 思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的. 具体可以看q学姐的B站视频 代码: #include<cmath> #i ...
- POJ2104-- K-th Number(主席树静态区间第k大)
[转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...
- HDU3727--Jewel (主席树 静态区间第k大)
Jewel Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- POJ 2104 HDU 2665 主席树 解决区间第K大
两道题都是区间第K大询问,数据规模基本相同. 解决这种问题, 可以采用平方划分(块状表)复杂度也可以接受,但是实际表现比主席树差得多. 这里大致讲一下我对主席树的理解. 首先,如果对于某个区间[L,R ...
- 主席树入门(区间第k大)
主席树入门 时隔5个月,我又来填主席树的坑了,现在才发现学算法真的要懂了之后,再自己调试,慢慢写出来,如果不懂,就只会按照代码敲,是不会有任何提升的,都不如不照着敲. 所以搞算法一定要弄清原理,和代码 ...
- POJ 2104 K-th Number (区间第k大)
题意:给定一个序列A,接下来又m个询问,每个询问输出A[L,R]中的第K大.(保证第k大存在) 思路: 我想拿来练习“可持久化线段树”的,搜到这个比较巧的算法也可以解决这个问题,叫“归并树?.大概的思 ...
- 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)
题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...
随机推荐
- python——元组(tuple)基本操作
元组被称为只读列表,数据可被查询,但不能被修改,类似于列表的切片操作,元组写在小括号里面()元素之前用逗号隔开 对于一些不想被修改的数据,可以用元组来保存 # 创建元组 1)创建空元组 # 创建空元 ...
- docker和docker compose常用操作命令
首先区分一下docker中几个概念 Image:镜像,相当于一个root文件系统,不包含任何动态数据 Container:容器,镜像运行时的实体,实质是进程,容器进程运行于属于自己的独立的命名空间 d ...
- Android面试收集录 蓝牙与WiFi
1.打开手机中的蓝牙功能有哪些方法? 法1:使用Intent ==>new Intent(BluetoothAdaper.ACTION_REQUEST_ENABLE); startActivi ...
- 解析HTML利器AngleSharp介绍
解析HTML利器AngleSharp介绍 AngleSharp是基于.NET(C#)开发的专门为解析xHTML源码的DLL组件. 项目地址:https://github.com/FlorianRapp ...
- CC3200模块的内存地址划分和bootloader(一)
1. CC3200的内存地址划分非常特殊,如果没测试的话,很容易懵逼.我们先看芯片手册里面的内存地址.芯片的RAM是256KB,下图的0x2000 0000-0x2003 FFFF,正好是256KB. ...
- HMM相关文章索引
HMM相关文章索引 1条回复 HMM系列文章是52nlp上访问量较高的一批文章,这里做个索引,方便大家参考. HMM学习 HMM学习最佳范例一:介绍 HMM学习最佳范例二:生成模式 HMM学习最佳范例 ...
- 云计算之路-阿里云上:受够了OCS,改用ECS+Couchbase跑缓存
当今天早上在日志中发现这样的错误之后,对阿里云OCS(mecached缓存服务)的积怨倾泻而出. 2014-06-08 07:15:56,078 [ERROR] Enyim.Caching.Memca ...
- Mysql性能优化三:主从配置,读写分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- 安装arch系统时,把ubuntu的efi分区格式化
导致无法从grub进入ubuntu,之后我进入win10,把ubuntu的分区都删了. 再重启,只能进入黑色的grub界面,显示 grub>> 甚至无法进入win10.只能通过在开机时按F ...
- LeetCode 410——分割数组的最大值
1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution { public: // 若分割数组的最大值 ...