震惊!这道题居然不卡分块
分块之后直接可以过掉这道题(因为数据水)。看到没有人写分块的题解我就来写一个。因为这里的a序列是升序的,所以众数一定是在一段连续的区间中,我们可以先把每一个连续的数列合并了,代码如下
class line
{
public:
int start,end;
}l[maxn];
inline void first(void)
{
int la=a[1];
int cnt=1;//个数
l[cnt].start=1;
l[cnt].end=0;
for(int i=1;i<=n;i++)
{
if(a[i]==la) l[cnt].end++;
else l[++cnt].start=i,l[cnt].end=i,la=a[i];
}
}
每个line就表示了某个值在a中占的为止,这样会比直接暴力搜边界要快一些。 然后,我们按line分块就可以了,查询的时候因为是升序的所以可以二分。相信大家都会分块(蒟蒻必备骗分神器),我就不放代码了。 复杂度O(q×n×sqrt(n)),但常数比一般的分块小一点点。