主席树
洛谷题目传送门
BZOJ题目传送门
当一个数在这个区间内出现的次数超过一半时,其他所有数的出现次数之和一定小于这个数的出现次数。那么只要不断往出现次数多的那个数的位置递归下去即可。
讲得不是很清楚,大家看看代码然后感性理解一下会懂的
代码:
#include<cctype>
#include<cstdio>
#include<algorithm>
#define N 500005
using namespace std;
struct tree{
int ls,rs,sum;
}t[N*22];
int n,m,nd,num,rt[N];