题目链接:D. Destiny
题意:输入一个长度为n的序列,保证序列里的元素都是<=n的,然后q次询问,
每次输入l,r,k,询问区间内出现次数大于(r-l+1)/k的最小元素,没有的话是-1。
n,q<=3e5,2<=k<=5。
拿主席树维护数字出现次数,查询的时候二分区间去查,如果左端区间可能满足的话去左边找,如果没找到答案再去右边找。
我想着是这种查询最坏会把树的每个节点遍历一遍,单次查询复杂度就很很高,实际上远远达不到这个复杂度,出题人证明了单次查询复杂度为k*logn,暂时还没看懂。
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+7;
struct Tree{
int lc,rc;
int sum;
}tree[maxn*30];
int root[maxn];
int tot;
int build(int l,int r){
int k=++tot;
tree[k].sum=0;
if(l==r) return k;
int mid=(l+r)>>1;
tree[k].lc=build(l,mid);
tree[k].rc=build(mid+1,r);
return k