劃分樹
模板
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100100;
const int Deep=20;
struct PartitionTree{
int num[N],cnt[N];
}tree[Deep];
int sorted[N];
void build(int deep,int l,int r)
{
if(l==r)
return;
int mid=(l+r)>>1;
int key=sorted[mid];
int scnt=mid-l+1;
for(int i=l;i<=r;i++)
if(tree[deep].num[i]<key)
scnt--;
int p=l-1,p2=mid;
for(int i=l,cnt=0;i<=r;i++){
int num=tree[deep].num[i];
if(num<key||(num==key&&scnt)){
if(num==key)
scnt--;
cnt++;
tree[deep+1].num[++p]=num;
}
else
tree[deep+1].num[++p2]=num;
tree[deep].cnt[i]=cnt;
}
build(deep+1,l,mid);
build(deep+1,mid+1,r);
}
int query(int deep,int l,int r,int L,int R,int k)
{
if(l==r)
return tree[deep].num[l];
int mid=(l+r)>>1;
int left=0,sum_in_left=tree[deep].cnt[R];
if(l!=L){
left=tree[deep].cnt[L-1];
sum_in_left-=left;
}
if(sum_in_left>=k){
L=l+left;
R=L+sum_in_left-1;
return query(deep+1,l,mid,L,R,k);
}
else{
int a=L-l-left;
int b=R-L+1-sum_in_left;
L=mid+1+a;
R=L+b-1;
return query(deep+1,mid+1,r,L,R,k-sum_in_left);
}
}
int main()
{
int n,m,L,R,k;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&sorted[i]);
tree[0].num[i]=sorted[i];
}
sort(sorted+1,sorted+1+n);
build(0,1,n);
while(m--){
scanf("%d%d%d",&L,&R,&k);
printf("%d\n",query(0,1,n,L,R,k));
}
return 0;
}
問題集錦
相關文章
- [資料結構] 劃分樹資料結構
- 劃分樹模板+模板題--hdu4251
- hdu--4417Super Mario+劃分樹
- POJ2104 K-th Number【劃分樹】
- [NOIP2015 提高組] 運輸計劃(二分 + lca + 樹上差分)
- hud--4251The Famous ICPC Team Again+劃分樹入門題AI
- 點分樹
- WAF的幾種劃分方法和劃分型別型別
- 樹鏈剖分
- Note - 樹分治(點分治、點分樹)
- zone的劃分
- 子網劃分
- 資料劃分
- 單詞劃分
- 服務劃分
- 動態規劃之數的劃分動態規劃
- [OI] 樹鏈剖分
- 2024.3.14 樹鏈剖分
- 集合劃分 題解
- 01 分數規劃
- 01分數規劃
- 陣列元素劃分陣列
- 如何劃分微服務微服務
- 詳解平衡二叉樹的失衡型別劃分及調整策略設計二叉樹型別
- 等長子網劃分、變長子網劃分(網路整理)
- 淺談樹鏈剖分
- 樹鏈剖分總結
- 分類——決策樹模型模型
- Something about 樹鏈剖分
- Linux 上如何劃分VLANLinux
- 微服務劃分原則微服務
- Day6 差分和樹上差分
- 【TCP/IP】IP地址的劃分及其分類TCP
- 5分鐘瞭解二叉樹之AVL樹二叉樹
- 【動態規劃】樹形DP完全詳解!動態規劃
- 【筆記/模板】樹鏈剖分筆記
- 【模板】樹分塊(簡單版)
- #8. 「模板」樹鏈剖分