bzoj 2724 在线区间众数】的更多相关文章

如果不是在线,就是裸的莫队. 但这道题要求在线,然后就不会了.. 标程: http://hi.baidu.com/__vani/item/ecc63f3527395283c2cf2945 算法主要是分块,然后处理处f[i][j]从第i块到第j块这个块区间的信息. 第一个算法的思想是每个块区间除了维护答案,还记录了该块区间中每个数的个数,这样可以快速添加增加一个数到该区间,所以他查询的时候就是找到查询区间的完整的块,然后向左右扩展,记录下答案,再撤销修改.设块的长度为L,则时间复杂度为:O(m*n…
题意 在线区间众数 思路 预处理出 f[i][j] 即从第 i 块到第 j 块的答案.对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数.每次询问的复杂度是 sqrtn * logn . #include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<algorithm> #include<vec…
2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1908  Solved: 678 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 Output Sample Input 6 3 1 2 3 2 1 2 1 5 3 6 1 5 Sample Output 1 2 1 HINT 修正下: n <= 4…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2724 [算法] 分块算法在线维护区间众数 分块算法的精髓就在于 : 大段维护,局部朴素 这一题,我们可以将序列分成T段,那么每一段的长度就是(N/T) 对于每个询问,设l处于第p段,r处于第q段,那么 : 若p = q,用朴素算法计算出区间众数即可 否则,将这个序列分为三段 : 1.[L,R[p]] 2. [L[p+1],R[q-1]] 3. [L[q],r] 显然,区间众数只可能…
题目链接:BZOJ - 2724 题目分析 这道题和 BZOJ-2821 作诗 那道题几乎是一样的,就是直接分块,每块大小 sqrt(n) ,然后将数字按照数值为第一关键字,位置为第二关键字排序,方便之后二分查找某个值在某个区间内出现的次数. 预处理出 f[i][j] 即从第 i 块到第 j 块的答案. 对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数. 每次询问的复杂度是 sqrtn * logn . 注意:写代码的时候又出现了给 sort…
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和,事实上我是写后缀和..因为下标从0开始..), cnt[i][j][k]表示第i块中的前j个数中,k出现次数.预处理O(N1.5), 询问每次O(N0.5), 总O((N+M)N0.5) --------------------------------------------------------…
题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对于零散部分,我们还需要知道它们在区间中的出现次数.这部分至多有2sqrt(n)个 由于没有修改,离散化后对于每个数x开一个vector,把x出现位置push_back进去,查x时二分即可. 像普通分块一样更新即可.之前写了一堆特判 醉了 这个块大小怎么算..没算出来. //2520kb 19652m…
题意 给出一个序列,在线询问区间众数.如果众数有多个,输出最小的那个. 题解 这是一道分块模板题. 一个询问的区间的众数,可能是中间"整块"区间的众数,也可能是左右两侧零散的数中的任意一个.为了\(O(\sqrt n)\)求出究竟是哪一个,我们需要在一次对两侧零散点的扫描之后\(O(1)\)求出被扫数在区间内的的出现次数. 所以需要预处理的有: cnt[i][j]: i在前j块中出现的次数 mode[i][j]: 第i块到第j块组成的大区间的众数 #include <cstdio…
题面. 许久以前我还不怎么去机房的时候,一位大佬好像一直在做这道题,他称这道题目为"大分块". 其实这道题目的思想不只可以用于处理区间众数,还可以处理很多区间数值相关问题. 让我们在线处理区间众数. 数据范围1e5,考虑分块. 先对蒲公英种类离散化. 预处理 预处理出两个数组. 一个数组sum[ i ][ j ]表示第j种颜色到第i个分块的前缀和. 另一个数组 zhongshu[ i ][ j ]表示第i个分块到第j个分块这个区间内的众数. 维护这两个操作时间复杂度都不能超过n3/2.…
Input Output Sample Input 6 3 1 2 3 2 1 2 1 5 3 6 1 5 Sample Output 1 2 1 HINT \(n <= 40000\),$ m <= 50000$ 题意: 求区间众数 题解: 见代码 //解决本题的重要性质: //对于两个区间a,b,其中已知a区间的众数k //则众数一定为k或是b区间的任意一个数 #include<bits/stdc++.h> #define re register int using names…