poj2104 主席树模板题
2024-09-04 16:26:10
题意
给出n个数字组成的数字序列,有m组询问。每次询问包含三个数字l,r,k。对于每个询问输出序列区间[l,r]中第k大的数字。
分析
这是主席树的模板题,套板子就可以
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=+;
struct Value{
int x;
int id;
bool operator <(const Value &rhs)const{
return x<rhs.x;
}
}value[maxn];
int n,m,num,cnt;
int lc[*maxn],rc[*maxn],sumv[*maxn];
int a[maxn],root[maxn],Rank[maxn];
void update(int num,int old,int &o,int L,int R){
o=++cnt;
lc[o]=lc[old],rc[o]=rc[old],sumv[o]=sumv[old];
sumv[o]++;
if(L==R)return ;
int M=L+(R-L)/;
if(num<=M)update(num,lc[o],lc[o],L,M);
if(num>M)update(num,rc[o],rc[o],M+,R);
}
int query(int i,int j,int k,int L,int R){
int lsum=sumv[lc[j]]-sumv[lc[i]];
if(L==R)return L;
int M=L+(R-L)/;
if(lsum>=k)return query(lc[i],lc[j],k,L,M);
else return query(rc[i],rc[j],k-lsum,M+,R);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
value[i].x=a[i];
value[i].id=i;
}
sort(value+,value++n);
for(int i=;i<=n;i++){
Rank[value[i].id]=i;
}
num=,cnt=;
for(int i=;i<=n;i++){
update(Rank[i],root[i-],root[i],,n);
}
int l,r,k;
for(int i=;i<=m;i++){
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",value[query(root[l-],root[r],k,,n)].x);
}
return ;
}
最新文章
- Leetcode 216. Combination Sum III
- MVC3 新建项目
- 算法练习:寻找最小的k个数
- PYTHON学习之路_PYTHON基础(3)
- 餐厅到店点餐系统(APP)
- 深入理解计算机系统家庭作业汇总 20135301&;&;20135328
- D3.js 弦图的制作
- VC++下封装ADO类以及使用方法
- ubuntu 系统设置bugzilla制
- Python 实现 Discuz论坛附件下载权限绕过漏洞
- C语言课程设计大整数运算
- 前后端分离之CORS和WebApi
- 第一节:框架前期准备篇之Log4Net日志详解
- .Net程序员 初学Ubuntu ,配置Nignix
- Confluence 6 隐藏人员目录
- 【转】Robot Framework作者建议如何选择自动化测试框架
- ubuntu安装scrapy方法
- python实现排序算法(一)——插入排序算法
- 五个案例让你明白GCD死锁(转)
- Windows Server 2008 R2之一活动目录服务部署