题目大意
求区间内小于等于给定的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 是