代码源 Div1 - 108#464. 数数(主席树,区间比k小的数的个数)HDU4417
Posted 小哈里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码源 Div1 - 108#464. 数数(主席树,区间比k小的数的个数)HDU4417相关的知识,希望对你有一定的参考价值。
problem
solution
- 主席树查询区间比k小的数的个数
- 建树之后直接在目标区间的主席树内将 H 作为挡板递归计数。
#include<bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
typedef long long LL;
const int maxn = 100010;
//离散化
int a[maxn], b[maxn], num;
int getidx(int v) return lower_bound(b+1,b+num+1,v)-b;
//主席树,查询区间比k小的数的个数
struct HJTTree
typedef long long LL;
#define maxn 100010
struct node int sum, l, r; hjt[maxn*40];
int rt[maxn], cnt = 0;
void init() cnt = 0;
inline int CreateNode(int sum, int l, int r)
int idx = ++cnt;
hjt[idx].sum = sum;
hjt[idx].l = l;
hjt[idx].r = r;
return idx;
void insert(int &p, int pp, int pos, int l, int r)
p = CreateNode(hjt[pp].sum+1, hjt[pp].l, hjt[pp].r);
if(l == r)return ;
int mid = l+r>>1;
if(pos <= mid)insert(hjt[p].l, hjt[pp].l, pos, l, mid);
else insert(hjt[p].r, hjt[pp].r, pos, mid+1,r);
int query(int u, int v, int h, int l, int r)
if(r <= h)return hjt[v].sum-hjt[u].sum;
int mid = l+r>>1;
if(h <= mid)return query(hjt[u].l, hjt[v].l, h, l, mid);
else return query(hjt[u].r,hjt[v].r, h, mid+1, r)+hjt[hjt[v].l].sum-hjt[hjt[u].l].sum;
hjt;
int main()
IOS;
int T; cin>>T;
while(T--)
int n, m; cin>>n>>m;
for(int i = 1; i <= n; i++)
cin>>a[i]; b[i] = a[i];
sort(b+1,b+n+1);
num = unique(b+1,b+n+1)-(b+1);
hjt.init();
for(int i = 1; i <= n; i++)
hjt.insert(hjt.rt[i], hjt.rt[i-1], getidx(a[i]), 1, num);
while(m--)
int l, r, h; cin>>l>>r>>h;
// l++; r++;
h = upper_bound(b+1,b+num+1,h)-b;
if(h != 1)cout<<hjt.query(hjt.rt[l-1], hjt.rt[r], h-1, 1, num)<<"\\n";
else cout<<"0\\n";
return 0;
以上是关于代码源 Div1 - 108#464. 数数(主席树,区间比k小的数的个数)HDU4417的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 464E The Classic Problem | 呆克斯歘 主席树维护高精度
Codeforces 464E #265 (Div. 1) E. The Classic Problem 主席树+Hash