Problem Analysis
题目大意: 对于给定的序列,输出待查询区间内出现次数严格大于区间长度一半的数字。若不存在输出 0 0 0。
维护区间内数的个数,那么考虑用可持久化权值线段树(主席树)解决。
首先考虑非法状态:因为对于主席树上任意一个节点,其代表的意义是管辖区间内数字的个数。因此对于主席树上某个节点,如果其代表区间数字的数目比区间长度的一半(也就是 r − l + 1 2 \frac{r - l + 1}{2} 2r−l+1)要小,那么子区间不回再出现满足该条件的数,在这种情况下可以直接返回 0 0 0。
对于其他的情况,按照主席树的套路进行搜索即可。
Accepted Code
#include
using namespace std;
const int N = 5e5 + 10;
int a[N], b[N];
int tot, root[N a[i];
b[i] = a[i];
}
sort(b + 1, b + n + 1);
int m = unique(b + 1, b + n + 1) - b - 1;
for(int i = 1; i > l >> r;
int k = (r - l + 1) >> 1;
cout
关注
打赏
- 回坑记之或许是退役赛季?
- [LCT刷题] P1501 [国家集训队]Tree II
- [LCT刷题] P2147 洞穴勘测
- 2022-2023 ICPC Brazil Subregional Programming Contest VP记录
- [线段树套单调栈] 2019-2020 ICPC Asia Hong Kong Regional Contest H.[Hold the Line]
- The 2021 ICPC Asia Nanjing Regional Contest E.Paimon Segment Tree 区间合并线段树/维护矩阵乘法
- CF580E - Kefa and Watch 线段树维护哈希
- HDU5869 Different GCD Subarray Query 离线查询/区间贡献
- 27.CF1004F Sonya and Bitwise OR 区间合并线段树
- 26.CF1000F One Occurrence