静态区间第K小....划分树裸题

Kth number

Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 5341    Accepted Submission(s): 1733

Problem Description
Give you a sequence and ask you the kth big number of a inteval.
 
Input
The first line is the number of the test cases. 

For each test case, the first line contain two integer n and m (n, m <= 100000), indicates the number of integers in the sequence and the number of the quaere. 

The second line contains n integers, describe the sequence. 

Each of following m lines contains three integers s, t, k. 

[s, t] indicates the interval and k indicates the kth big number in interval [s, t]
 
Output
For each test case, output m lines. Each line contains the kth big number.
 
Sample Input
1
10 1
1 4 2 3 5 6 7 8 9 0
1 3 2
 
Sample Output
2
 
Source
 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int maxn=100100; int tree[20][maxn];
int sorted[maxn];
int toleft[20][maxn]; void build(int l,int r,int dep)
{
if(l==r) return ;
int mid=(l+r)/2;
int same=mid-l+1;
for(int i=l;i<=r;i++)
if(tree[dep][i]<sorted[mid]) same--;
int lpos=l,rpos=mid+1;
for(int i=l;i<=r;i++)
{
if(tree[dep][i]<sorted[mid])
tree[dep+1][lpos++]=tree[dep][i];
else if(tree[dep][i]==sorted[mid]&&same>0)
{
tree[dep+1][lpos++]=tree[dep][i];
same--;
}
else tree[dep+1][rpos++]=tree[dep][i]; toleft[dep][i]=toleft[dep][l-1]+lpos-l;
}
build(l,mid,dep+1);
build(mid+1,r,dep+1);
} int query(int L,int R,int l,int r,int dep,int k)
{
if(l==r) return tree[dep][l];
int mid=(L+R)/2;
int cnt=toleft[dep][r]-toleft[dep][l-1];
if(cnt>=k)
{
int newl=L+toleft[dep][l-1]-toleft[dep][L-1];
int newr=newl+cnt-1;
return query(L,mid,newl,newr,dep+1,k);
}
else
{
int newr=r+toleft[dep][R]-toleft[dep][r];
int newl=newr-(r-l-cnt);
return query(mid+1,R,newl,newr,dep+1,k-cnt);
}
} int main()
{
int T_T,n,m;
scanf("%d",&T_T);
while(T_T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",sorted+i);
tree[0][i]=sorted[i];
}
sort(sorted+1,sorted+1+n);
build(1,n,0);
int l,r,k;
while(m--)
{
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",query(1,n,l,r,0,k));
}
}
return 0;
}

最新文章

  1. Tableau未必最佳,国内BI也能突破重围!
  2. IPv4组播通信原理
  3. 简单的内网存活主机ip扫描
  4. linux下编译安装curl
  5. 学习OpenCV——Gabor函数的应用
  6. MySQL深入利用Ameoba实现读写分离
  7. 为jquery qrcode生成的二维码嵌入图片
  8. SQL server connection KeepAlive[转]
  9. CentOS中基于不同版本安装重复包的解决方案
  10. [带你飞]一小时带你学会Python
  11. SPRING IN ACTION 第4版笔记-第六章RENDERING WEB VIEWS-006- 使用thymeleaf(TemplateResolver、SpringTemplateEngine、ThymeleafViewResolver、th:include、th:object、th:field=&quot;*{firstName}&quot;)
  12. Python中初始化的问题以及注释问题
  13. 直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序
  14. Solr搜索引擎搭建详细过程
  15. docker生态系统
  16. 渗透测试学习 九、 MSsql注入上
  17. H264编码 封装成MP4格式 视频流 RTP封包
  18. Mac安装mysql8.0.12
  19. 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作
  20. Linux下面makefile编写

热门文章

  1. Android WebView挂马漏洞--各大厂商纷纷落马
  2. win32收不到F10按键消息解决办法
  3. [置顶] 页面缓存,cache,设置缓存过期时间,OutputCache
  4. 不要打开文件,阅读Rvt信息档案
  5. 访何红辉:谈谈Android源码中的设计模式
  6. android画笔错位问题的解决
  7. setChecked方法触发onCheckedChanged监听器问题
  8. Android清理设备内存具体完整演示样例(一)
  9. HDU 4869 Turn the pokers(推理)
  10. 读 Working with forms 一些心得