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;
}

相关文章推荐

ACM常用模板——数据结构——优先队列(堆)

数据结构——优先队列(堆)

ACM常用模板——数据结构——treap树

ACM常用模板——数据结构——treap树

ACM常用模板——数据结构——树状数组

ACM常用模板——数据结构——树状数组

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

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

数据结构面试题1.2.6-Top K算法详细解析——百度面试题

资料: 十一、从头到尾解析Hash 表算法 http://blog.csdn.net/v_JULY_v/article/details/6256463 其实可以直接用hash-map的方法来算 htt...

数据结构课设题目——求第K短的最短路径

(1) 问题描述 最短路径问题是图论中的一个经典问题,主要研究成果有Dijkstra、Floyd等优秀算法,Dijkstra算法一直被认为是图论中的好算法。但这两个算法有一个共同的缺陷:这里的最短路...

2017西安交大ACM小学期数据结构 [分块,区间修改,单点查询]

Problem A 发布时间: 2017年6月28日 09:29   最后更新: 2017年6月28日 13:03   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ACM常用模板——数据结构——区间第K大
举报原因:
原因补充:

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