HDU - 4417 Super Mario (主席树,查找小于等于 k 的数的个数 )

 

题目大意

求区间内小于等于给定的K的数的个数

思路:

离散化去重之后,用主席树维护权值线段树,查询即可。

这个题注意二分的时候边界取值,

还有 0 的特判。

同样考虑用主席树来维护,每次只需要找到序列b中第一个等于k的数,那么要求的数必定在d[1]~d[upper_bound(k)]这个范围内,接下来就像线段树统计区间个数那样,若完全包含则直接加上e[rr].sum-e[ll].sum,否则就分两边递归统计。而建树什么的就直接套模板即可.

因为主席树的叶子节点是按顺序递增的。 像树状数组找逆序对,在数值的位置上 变现 为 1.

所以所有的满足要求的数,即小于等于k的数,都会在d[1]~d[upper_bound(k)]   之间出现。

 

#include <bits/stdc++.h>
#define mem(x,v) memset(x,v,sizeof(x)) 
#define rep(i,a,b)  for (int i = a; i < b; i++)
#define per(i,a,b)  for (int i = a; i > b; i--)
using namespace std;
typedef long long LL;
const double EPS = 1e-10;
const int INF = 0x3f3f3f3f;
const int N = 2e6+10;
const int M = 1e5+10;
struct segtree{
	int l,r,sum;
}f[N];
struct node {
	int a,v;
}c[M]; 
int val[M],rt[M],d[M]; //val 是
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值