今天原来是平安夜啊 感觉这题是道好题. 一个套路枚举权值\(x\),把权值等于\(x\)的设为1,不等于的设为-1,然后问题转化为多少个区间权值和大于. 发现并不是很好做,还有一个套路,用前缀和查分来表示区间.然后就是 \[i<j\] \[sum[i]<sum[j]\] 然后树状数组可以做\(a[i]\leq7\)的数据. 那么\(a[i]\)那么大该怎么办? 考虑我们构建的\(1,-1\)数列中连续-1的数列很多. 然后这些连续-1不会互相影响的贡献,然后我们考虑直接算出这些连续-1的贡献.…
题面传送门 题意: 给出一个序列 \(a\),求 \(a\) 有多少个子区间 \([l,r]\),满足这个区间中出现次数最多的数出现次数 \(>\dfrac{r-l+1}{2}\) \(1 \leq n \leq 5\times 10^5\) 首先肯定要枚举出现次数最多的数是什么,假设为 \(x\). 记序列中为 \(x\) 的数为 \(+1\),数列中不为 \(x\) 的数为 \(-1\),那么 \(x\) 出现次数 \(>\dfrac{r-l+1}{2}\) 等价于该区间中对应的数的和 \…
洛谷题面传送门 一个线性做法. \(n\log n\) 解法可以戳这里查看 首先回顾一下 \(n\log n\) 解法的过程:我们对于每一个数 \(x\),考察其出现位置,设为 \(t_1,t_2,t_3,\cdots,t_c\),然后在这些位置上填上 \(1\),其余位置上填上 \(-1\),然后对序列做一遍前缀和,那么该数对答案的贡献就是前缀和数组中顺序对个数. 直接 \(n\log n\) 求复杂度好像有一点高,怎样优化复杂度呢?首先注意到每个可能成为区间右端点的位置并不多,具体来说,我们…
思路:分治 提交:2次 错因:数组开小 题解: 我们枚举一下众数\(x\). 设\(s[n]=\sum_{i=1}^n [a[i]==x]\) 那么对于区间\((l,r]\),有\(s[r]-s[l]>\frac{r-l}{2}\) 即\(2*s[r]-r>2*s[l]-l\) 考虑分治,我们求出所有过中点的区间\([l,r]\)的贡献. 如何求呢?首先观察一个性质,两个子区间的众数至少有1个是大区间的众数,反之亦然. 那么我们先求出子区间中的众数,作为大区间的可行众数.然后我们枚举每个可行众…
Description 给定一个长度为 \(n\) 的序列,求有多少子区间满足区间众数严格大于区间长度的一半.如果区间有多个出现次数最多且不同的数则取较小的数为众数. Limitation 对于全部的数据,\(1 \leq n \leq 500000\) 序列中数的值域为 \([0,n)\) 子任务:序列中的数值域为 \([0,7]\) Solution 考虑如果区间有多个出现次数最多且不同的数,那么这个区间显然是不合法的.于是区间出现多个众数取最小的限制其实没有什么 * 用. 考虑枚举区间众数…
题面 题解 upd : \(cnt_i\) 代表值为 \(i\) 的个数 我们可以暴力枚举众数 \(k\) 把等于 \(k\) 的赋值成 1 , 不等于 \(k\) 的赋值成 -1 这样原序列就变成了一段折线 我们把他剖开一段一段来分析 这些蓝线的左右端点分别为, 一个值为众数的数的位置, 和它下一个值为众数的数的位置的前一个位置 为了方便, 我们定义 \(0\) , \(n + 1\) 这两个位置上的数可以当做任意一个位置 我们对于一条蓝线扯出来单独分析 设它的值域为 \([l, r]\) ,…
[BZOJ5110][CodePlus2017]Yazid 的新生舞会 Description Yazid有一个长度为n的序列A,下标从1至n.显然地,这个序列共有n(n+1)/2个子区间.对于任意一个子区间[l,r],如果该子区间内的众数在该子区间的出现次数严格大于(r?l+1)/2(即该子区间长度的一半),那么Yazid就说这个子区间是"新生舞会的".所谓众数,即为该子区间内出现次数最多的数.特别地,如果出现次数最多的数有多个,我们规定值最小的数为众数.现在,Yazid想知道,共有…
LOJ BZOJ 洛谷 又来发良心题解啦 \(Description\) 给定一个序列\(A_i\).求有多少个子区间,满足该区间众数出现次数大于区间长度的一半. \(n\leq5\times10^5,\ 0\leq A_i\lt n\). \(Solution\) 考虑\(x\)作为众数合法的区间有哪些.令\(B_i=[A_i=x]\),对\(B_i\)求个前缀和\(s_i\).那么区间\([l,r]\)合法当且仅当\(s_r-s_{l-1}\gt0\). 其实就是对\(s\)求顺序对个数.用…
学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2*s_l-l$的区间$[l+1,r]$其众数为$x$,这个显然可以用一个数据结构来维护. 直接扫一遍效率是$O($数字种类数$*nlogn)$的,无法承受,但是我们发现,对于每一段非$x$的数,$2*s_i-i$是公差为$-1$的等差数列,所以它们对答案的贡献实际上可以一次性计算.设$L$为一段非$x$数…
(很久之前刷的题现在看起来十分陌生a) 题意: 给你一个长度为n的序列A,定义一个区间$[l,r]$是“新生舞会的”当且仅当该区间的众数次数严格大于$\frac{r-l+1}{2}$,求有多少子区间是“新生舞会的”. $n\leq 500000,0\leq A_{i} \leq n-1$ 题解: 关于区间众数的问题一般有一个套路:枚举众数后转换成区间求和问题. 考虑枚举众数k,若将序列中等于k的元素视作+1,其他视作-1,那么“新生舞会的“区间必然满足区间之和大于0. 问题变成了如何快速求出有多…