POJ2104&&HDU2665(静态区间第K小)】的更多相关文章

题目大意 给定一个有N个数字的序列,然后又m个查询,形式如下: l r k 要求你返回区间[l,r]第k小的数是哪个 题解 终于弄懂主席树是个啥东西了,O(∩_∩)O~~,这题正是主席树的裸题,主席树具体是啥东西,可以去看CLJ的论文~~~~ 代码是学习haha593572013大神的~~~ 代码: #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> us…
JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k小的值(可重),动态问题还要求支持单点修改操作. 这个问题也可以用线段树+Splay/整体二分解决,然而那些对蒟蒻来说都太难辣QwQ,这里给一个XZY大佬的整体二分的讲解传送门 我们的做法是主席树+树状数组,如果有不会主席树的同学可以看我之前写的博客=w=,由于静态问题是动态问题的基础,所以我会先讲…
题目链接:https://vjudge.net/problem/POJ-2104 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 64110   Accepted: 22556 Case Time Limit: 2000MS Description You are working for Macrohard company in data structures department. After…
传送门:https://www.luogu.org/problemnew/show/P3834 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 分析 很多人都说是用主席树来维护,一开始蒟蒻chh做这道题的时候还以为是分块乱搞,但是发现常数非常的大,就转用主席树了.这道题我们维护的主席树是一个权值线段树,意思就是维护一个桶,那么我们手动模拟主席树的建树过程,可以发现如果我们要查询区间\([l,r]\),那么发现编号为l-1的主席树和编号为r的主席树上对应的链上的…
题目链接 题解 主席树入门题 但是这里给出整体二分解法 整体二分顾名思义是把所有操作放在一起二分 想想,如果求\([1-n]\)的第\(k\)小怎么二分求得? 我们可以二分答案\(k\), \(O(n)\)统计有多少个数小于等于\(k\) 如果对于每个询问都这么搞,肯定不行 我们可以发现,如果每次都搞一次,有许多算重复的地方 \(div(l, r, st, ed)\)表示\(k\)二分的区间\([l-r]\), 对应操作答案区间在\([st-ed]\) (如果没看懂,先往下看.) \(mid =…
题目链接:http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 64277   Accepted: 22615 Case Time Limit: 2000MS Description You are working for Macrohard company in data structures department. After faili…
可持久化线段树 也叫函数式线段树也叫主席树,其主要思想是充分利用历史信息,共用空间 http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html 这个博客总结的挺好的! 区间k大数问题 对于没有修改的版本,我们可以先离散化然后对权值建树. 结点存储的是该权值范围内出现元素的总次数. 在线段树上找k大数时就像平衡树询问k大数一样根据结点上的信息往左或者往右走. 现在可以利用函数式线段树维护权值出现数量,将数列中每个结点依次插入线段树, 第r次插入后的线段…
首先看一下这个人的blog吧,讲的精炼http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html 然后再推荐一下这个人的blog:http://www.cnblogs.com/zinthos/p/3899565.html 这两个博客看了就差不多了. 自己说一下对代码的理解吧. 就是每一个数字开一个空间,然后每个空间用tot标号,最后tot就是总体开的数目.然后不同的线段树可能有相同的左儿子或者右二子(或者左=右,右=左),然后具体都是通过tot的储存…
题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#define gc() getchar() #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++) const int N=2e5+5,MAXIN=2e6; int n,m,A[N],ref[N],cn…
蒟蒻终于学会整体二分啦! 思路 实现 丑陋无比的代码 #include <bits/stdc++.h> using namespace std; const int N = 200005; int ar[N]; int lowbit(int t) { return t & (-t); } void add(int i, int v) { for (; i < N; ar[i] += v, i += lowbit(i)); } int sum(int i) { int s = 0;…
传送门主席树 #include <bits/stdc++.h> #define int long long using namespace std; const int maxn=2e5+5; int n,m,a[maxn]; vector<int> v;//从0开始编号 inline int getid(int x)//得到值为x的编号 { return lower_bound(v.begin(),v.end(),x)-v.begin()+1;//lower_bound找到第一个…
原来主席树就是可持久化线段树啊,刚知道,,, 作为一道裸题,还是必A的,然而一开始偷懒不写离散化跪了N多遍,后来在缪大的帮助下发现了这个问题,遂A之 ——又是这种破问题,实在不想说自己了 把n个数看成n次修改,对于每一次都建线段树,于是就能得到N棵线段树 然后时间空间全都爆炸,我们得到了完美的程序 但是每次因为只修一个叶子,所以只有一条根到叶的节点被修改,只要把这一部分备份一份就好了 最后返回新的根,用于保存 最后求的时候只要把两端点(左端点-1)的线段树上的点权值一减就搞定了 代码难看的要死,…
给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多种做法: 1. 归并排序 POJ 2104, 静态区间第K小 #include <bits/stdc++.h> using namespace std; ); ][N]; void merge(int id, int b, int e){ ; for(int l=b, r=mid, i=b; i&…
接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的时候百度了一下,看到了"主席树"这一名字的由来-- 线段树竟然是被一个黄嘉泰的大佬因不会划分树来代替的,,,,,因缩写是HJT取名为主席树= =!orz 我的内心瞬间感到了不安......(看我的名字,就在右边) 能跟神犇有相同的缩写是何等荣幸!看来这个主席树我得好好学了. 那么接下来进入…
我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构(是线段树畸形程度的两倍),然而不学又不行,在考试中出现的频率也很高(?),更重要的是它向我们展示了一个船新的思想--可持久化. 在我学习主席树时,我在网上查了一篇又一篇博客,然而还是感到非常懵逼 0_0 ,这些博客大多由静态区间第k小这一问题来作为学习主席树的切入点,然而--当我学会主席树之后,我才…
题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示序列的长度和查询的个数. 第二行包含N个整数,表示这个序列各项的数字. 接下来M行每行包含三个整数l, r, kl,r,k , 表示查询区间[l, r][l,r]内的第k小值. 输出格式: 输出包含k行,每行1个整数,依次表示每一次查询的结果 输…
K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 43315   Accepted: 14296 Case Time Limit: 2000MS Description You are working for Macrohard company in data structures department. After failing your previous task about key inse…
题意就是区间第k大…… 题解: 前段时间用主席树搞掉了…… 如今看到划分树,是在想来写一遍,结果18号对着学长的代码调了一上午连样例都没过,好桑心…… 今天在做NOI2010超级钢琴,忽然发现用划分树很直观,果断决定再战划分树 对着网上的c++代码抄了一遍,A了,可是这编程复杂度有点高,忽然又看见盾哥的代码 很简短,和我原先的代码差不多,他怎么能A了呢……(后来发现区间第k小,我却写的第k大……sb啊) 考虑到盾哥的程序用到了离散化,因此没有考虑存在两个数相等的情况,这样就使代码减少很多 我报着…
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出权值线段树前缀和,相减就是区间前缀和.而且我维护也只要改logn棵树就好了.具体看JQ博客. 代码: #include<cmath> #include<set> #include<map> #include<queue> #include<cstdio&g…
主席树--动态区间第\(k\)小 模板题在这里洛谷2617. 先对几个问题做一个总结: 阅读本文需要有主席树的基础,也就是通过区间kth的模板题. 静态整体kth: sort一下找第k小,时间复杂度\(O(nlogn)\). 动态整体kth: 权值线段树维护一下,时间复杂度\(O(nlogn)\). 静态区间kth: 主席树维护,时间复杂度\(O(nlogn)\). 动态区间kth: 就是本次的标题. 回忆一下主席树是如何维护静态区间kth的. 建立可持久化线段树后,利用前缀和的思想查询区间的k…
Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3047    Accepted Submission(s): 701 Problem Description You are given N positive integers, denoted as x0, x1 ... xN-1. Then give you…
题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n,w\leq n\) 题解 考虑整体二分. 先看看离线要怎么做. 现在我们要计算每个数对每个区间的贡献. 对于每个询问区间和每种数,让这个区间最右边\(w\)个数对这个询问的贡献为\(1\),第\(w+1\)个数对这个询问的贡献为\(-w\). 这样每个数的贡献就是二维平面上的一个矩形.可以用扫描线+线段…
题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<iostream> #include<stdio.h> #include<algorithm> #include<vector> using namespace std; # define ll long long ; struct node { int sum; in…
Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11394    Accepted Submission(s): 3465 Problem Description Give you a sequence and ask you the kth big number of a inteval.   Input The…
K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 57543   Accepted: 19893 Case Time Limit: 2000MS Description You are working for Macrohard company in data structures department. After failing your previous task about key inse…
少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写,不会的同学可以看一下这个. 加上修改怎么做呢?我们可以用数学老师成天讲的类比思想: 可以发现,不修改的区间k小问题中,每加入一个原序列中的数,对应的主席树在上一个的基础上进行修改,而查询的时候用右端点主席树减去左端点左边的主席树.这样的操作就像是维护前缀和:每次加入一个元素的时候,sum[i] =…
Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16941    Accepted Submission(s): 5190 Problem Description Give you a sequence and ask you the kth big number of a inteval.   Input The…
题目描述 从前有\(n\)只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力\(a_i\).跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间\(k\)小值.他每次向它的随从伏特提出这样的问题: 从左往右第\(x\)个到第\(y\)个跳蚤中,a[i]第\(k\)小的值是多少. 这可难不倒伏特,他在脑袋里使用函数式线段树前缀和的方法水掉了跳蚤国王 的询问. 这时伏特发现有些跳蚤跳久了弹跳力会有变化,有的会增大,有的会减少. 这可难不倒伏特,他在脑袋里使用树状…
The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询 每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素 n <= 250 ,q <= 250000 , a[i][j]<=10000 思路:用到了主席树求区间第k小, 主席树本质是可持久化权值线段树,用区间[l,r]表示值在[l,r]间的数字有多少个 每插入一个数字,实际上只修改了log个区间,其他的部分不发生变化,所以只需要对修改的区间新开结点即可 求区间第k小…
[模板]区间第k小 我实在是太弱了现在才会这个东西QAQ. 主席树做法. 一张关于主席树的无字说明 线段树\(2\)是只单点修改了实心酒红色点的线段树\(2\),线段树\(2\)中的蓝色节点实际上就是线段树\(1\)的蓝色节点,我们只是把地址复制过来了. 我们多开了一个线段树,但是节点数量却只多了\(log\)层,那么对于\(n\)的历史版本保留就提供了\(O(nlogn)\)的数据结构啦. 具体代码怎么实现?我研究了一下,发现实际写出来的代码和大家常写的代码是一样的.实现其实非常简单,只需要在…