ACM常用模板——数据结构——区间第K大

原创 2015年11月17日 15:41:40
归并树模板
hdu2665
#define LL long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1 | 1
using namespace std;
const int B=1000,maxn=100005;
int n,m;
int a[maxn],nums[maxn];
int L[maxn],R[maxn],K[maxn];
vector<int>dat[maxn<<2];
void PushUp(int rt)
{
merge(dat[rt<<1].begin(),dat[rt<<1].end(),dat[rt<<1|1].begin(),dat[rt<<1|1].end(),dat[rt].begin());
}
void build(int l,int r,int rt)
{
dat[rt].clear();
if(l==r)
{
int x;
//scanf("%d",&x);
//printf("[%d,%d] = x = %d\n",l,r,a[l-1]);
dat[rt].push_back(a[l-1]);
return ;
}
int m=(l+r)>>1;
build(lson);
build(rson);
dat[rt].resize(r-l+1);
PushUp(rt);
}
int Query(int L,int R,int x,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return upper_bound(dat[rt].begin(),dat[rt].end(),x)-dat[rt].begin();
}
int m=(l+r)>>1,sum=0;
if(L<=m) sum+=Query(L,R,x,lson);
if(R>m) sum+=Query(L,R,x,rson);
return sum;
}
void solve()
{
sort(a,a+n);
for(int i=0;i<m;i++)
{
int l=0,r=n-1,ans;
while(l<r)
{
int mid=(l+r)>>1;
int x=a[mid],c=Query(L[i],R[i],x,1,n,1);
if(c<K[i]) l=mid+1;
else r=mid;
}
printf("%d\n",a[r]);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
build(1,n,1);
for(int i=0;i<m;i++) scanf("%d%d%d",&L[i],&R[i],&K[i]);
solve();
}
return 0;
}

【填坑】可持久化线段树解决无修改的区间k大问题

区间k大问题是一个比较经典的问题,各种方法层出不穷,写暴力的、树套树的、主席树的、分块大法好(@LOI_DQS)的…… 这里讲一下权值线段树+可持久化解决的方法(不支持修改操作)...
  • FAreStorm
  • FAreStorm
  • 2015年12月17日 09:39
  • 1475

zoj 2112 Dynamic Rankings 带修改区间第k大的几种解法

给出n个数,有两种操作,一种是修改某个数的值,另一种查询指定区间第k大。 比较快的做法是树套树,而分块算法复杂度比较高写起来方便。分块算法可以很简单的处理单独修改某个值的情况。 将n个数分成num块,...
  • HTT_H
  • HTT_H
  • 2015年08月16日 12:28
  • 1626

HDU 2665 主席树(求区间第k大模板)

题意:给出一串长度为n的序列,并给出m个询问,每个询问针对序列中一段区间[s,t],求这区间中第k小的数字是多少。思路:非常经典的主席树问题。 主席树正规的名字是可持久化线段树,形象来说就是将线段树...
  • Bahuia
  • Bahuia
  • 2017年08月23日 18:36
  • 190

询问区间第k大(小)——主席树

例题 K-th Number You are working for Macrohard company in data structures department. After failing ...
  • samjia2000
  • samjia2000
  • 2015年08月13日 07:47
  • 1437

【数据结构练习】 求区间第K大数的几种方法

这类求数列上区间第K大数的题目非常非常多。 比如HDOJ 2665,SOJ 3147,POJ 2104,POJ 2761(区间不包含)。 当然求解这个问题的方法也非常多,所以在这里做一下总结。...
  • frog1902
  • frog1902
  • 2013年07月31日 06:43
  • 3928

POJ 2761(Treap离线求区间第k大数)

网上有好多解法,我照着LRJ的白书敲了一个板子吧,3907ms过的,这题还可以SBT过,主席树也是可以过得。划分树不知道行不行,反正做法挺多。。T_T。...
  • u012350533
  • u012350533
  • 2014年05月08日 17:25
  • 1493

hdu 5412 CRB and Queries(动态区间第k大值,区间能修改)(整体二分,树状数组套平衡树,线段树套treap)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5412 解题思路: 官方题解: In this problem, we can u...
  • piaocoder
  • piaocoder
  • 2015年08月25日 17:23
  • 1159

51nod1686 第K大区间

链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意:中文题。 分析:二分答案就行了。但是!有一个坑,k...
  • Fsss_7
  • Fsss_7
  • 2016年03月30日 20:22
  • 446

可持久化线段树——Step 1 静态区间第K大

考虑这样一个问题: 给出一段长度为n序列{ai}\{a_i\},对于一些询问{L,R,K}\{ L, R, K\}请输出序列上[L,R][L,R]内第K大的数。关于暴力做法,其实是很简单的,但是会...
  • WT_cnyali
  • WT_cnyali
  • 2017年03月17日 16:49
  • 381

bzoj 1901 Zju2112 Dynamic Rankings(动态区间第k大,主席树)

动态区间第k大,就是有修改的区间第k大,不能只用主席树了动态区间第k大,就是有修改的区间第k大,不能只用主席树了 需要树状数组套主席树来搞,时间复杂度O(nlognlogn)需要树状数组套主席树来搞...
  • Miracle_ma
  • Miracle_ma
  • 2016年09月29日 15:22
  • 315
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ACM常用模板——数据结构——区间第K大
举报原因:
原因补充:

(最多只允许输入30个字)