区间众数

金牌导航 分块-1

题目大意

给出一个数列,和若干询问,每个询问让你求一个区间内的众数

输入样例

6 3
1 2 3 2 1 2
1 5
3 6
1 5

输出样例

1
2
1

数据范围

1⩽N⩽4×104,1⩽M⩽5×104,1⩽ai⩽1091\leqslant N \leqslant 4\times 10^4,1\leqslant M \leqslant 5\times 10^4,1\leqslant a_i \leqslant 10^91⩽N⩽4×104,1⩽M⩽5×104,1⩽ai​⩽109

解题思路

对于求区间众数,线段树不易维护
考虑分块
先对数列a离散化
然后枚举一遍数列a,求出numi,jnum_{i,j}numi,j​(前i个块中j颜色出现的次数),时间O(nn)O(n\sqrt{n})O(nn​)
然后求一段连续块的众数,先枚举左段的块,然后暴力搜右节点,时间O(nn)O(n\sqrt{n})O(nn​)
然后对于每次查询,暴力枚举不在整一个块的数

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 40010
#define QN 210
using namespace std;
int n, m, x, y, g, L, R, nn, nm, a[N], b[N], p[N], f[QN][QN], num[QN][N];
int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i){scanf("%d", &a[i]);b[i] = a[i];}sort(b + 1, b + 1 + n);g = unique(b + 1, b + 1 + n) - b - 1;for (int i = 1; i <= n; ++i)a[i] = lower_bound(b + 1, b + 1 + g, a[i]) - b;nn = sqrt(n);g = 0;nm = n / nn + (n % nn? 1: 0);for (int i = 1; i <= n; ++i){p[a[i]]++;if (i % nn == 0){g++;for (int j = 1; j <= n; ++j)num[g][j] = p[j];}}if (g < nm){for (int j = 1; j <= n; ++j)num[n / nn + 1][j] = p[j];}for (int i = 1; i <= nm; ++i){g = 0;memset(p, 0, sizeof(p));for (int j = (i - 1) * nn + 1; j <= n; ++j){p[a[j]]++;if (p[a[j]] > p[g] || p[a[j]] == p[g] && a[j] < g) g = a[j];if (j % nn == 0) f[i][j / nn] = g;}}memset(p, 0, sizeof(p));g = 0;while(m--){scanf("%d%d", &x, &y);x = (x + b[g] - 1) % n + 1;y = (y + b[g] - 1) % n + 1;if (x > y) swap(x, y);L = (x + nn - 2) / nn + 1;R = y / nn;if (L > R)//没包含任意一个整的块直接暴力{g = 0;for (int i = x; i <= y; ++i){p[a[i]]++;if (p[a[i]] > p[g] || p[a[i]] == p[g] && a[i] < g)g = a[i];}for (int i = x; i <= y; ++i)p[a[i]]--;printf("%d\n", b[g]);continue;}g = f[L][R];for (int i = x; i <= min((L - 1) * nn, n); ++i){p[a[i]]++;int X = p[a[i]] + num[R][a[i]] - num[L - 1][a[i]];//加上整的块里面的int Y = p[g] + num[R][g] - num[L - 1][g];if (X > Y || X == Y && a[i] < g)g = a[i];}for (int i = max(R * nn + 1, 1); i <= y; ++i){p[a[i]]++;int X = p[a[i]] + num[R][a[i]] - num[L - 1][a[i]];int Y = p[g] + num[R][g] - num[L - 1][g];if (X > Y || X == Y && a[i] < g)g = a[i];}for (int i = x; i <= min((L - 1) * nn, n); ++i)//把原来的清掉,不然要O(n),会超时p[a[i]]--;for (int i = max(R * nn + 1, 1); i <= y; ++i)p[a[i]]--;printf("%d\n", b[g]);}return 0;
}

【分块】区间众数(金牌导航 分块-1)相关推荐

  1. 【莫队】区间不同数(金牌导航 莫队-1)

    区间不同数 金牌导航 莫队-1 题目大意 给出n个数,然后询问m次,每次询问一个区间内不同的数的个数 样例输入 6 1 2 3 4 3 5 3 1 2 3 5 2 6 样例输出 2 2 4 数据范围 ...

  2. 【整体二分】区间第k小(金牌导航 整体二分-1)

    区间第k小 金牌导航 整体二分-1 题目大意 给出一个序列,有若干查询,每次查询给出l,r,k,让你求l~r这个区间的第k大 输入样例 7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 ...

  3. 【ybt金牌导航8-7-1】数对统计 / 关于莫比乌斯函数的少量内容

    数对统计 题目链接:ybt金牌导航8-7-1 题目大意 给你 n,m,求 gcd(x,y)=1 的数对个数. 1<=x<=n,1<=y<=m 思路 莫比乌斯函数 什么东西 首先 ...

  4. 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)

    正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米,给出高度,你可以选择一个区间,使这个区间的玉米高度+1,你可以进行k次这样的操作,查询你操作完后最长不下降子序列最大值 ...

  5. 【Splay】文艺平衡树(金牌导航 Splay-2)

    #文艺平衡树 金牌导航 Splay-2 题目大意 给你一个1~n的序列,然后对序列的区间做若干次翻转,问你最后的序列 输入样例 5 3 1 3 1 3 1 4 输出样例 4 3 2 1 5 数据范围 ...

  6. 【luogu P4036】【ybt金牌导航4-5-3】火星人

    火星人 题目链接:luogu P4036 / ybt金牌导航4-5-3 题目大意 给你一个字符串,要你维护三个东西. 修改字符串的一个字符,往字符串的一个地方插入一个字符,询问两个后缀的最长公共前缀. ...

  7. 【ybt金牌导航4-7-3】【luogu P3437】三维俄罗斯方块/TET-Tetris 3D

    三维俄罗斯方块/TET-Tetris 3D 题目链接:ybt金牌导航4-7-3 / luogu P3437 题目大意 要你支持区间求最大,并把这个区间的所有点高度改为你求得的最大值加一个值. 最后要你 ...

  8. 主席树 | 莫队 ---- Codeforces Round #716 (Div. 2) D. Cut and Stick [主席树or莫队优化] 区间众数问题(静态)

    题目链接 题目大意: 就是给你nnn个数,和q次询问,每次询问给你一个区间[l,r][l,r][l,r],问你把区间里面的数分配成最少多少块,使得块内出现最多次数的数不超过区间长度的一半(除不尽向上取 ...

  9. 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)

    正题 luogu 7302 金牌导航 数据结构优化DP-4 题目大意 在坐标轴上会出现n个金币,第i个金币tit_iti​时在wiw_iwi​出现(只出现一个单位时间),价值为sis_isi​,当你t ...

最新文章

  1. IMAP IDLE模式(推送邮件)
  2. 谁偷走了程序员的时间??
  3. 【java】四步法:spring boot项目部署在CentOS 8(后端篇)
  4. MOXy的对象图– XML和JSON的输入/输出局部模型
  5. unity中链接字符串和变量显示_理解Unity中的优化(六):字符串和文本
  6. init.d文件夹 2012-02-09
  7. webots使用以及第三方模型导入装配、运动学仿真教程
  8. win10重置计算机网络设置,为你解答win10下如何重置网络
  9. 微积分:如何理解多元函数可微和全微分?
  10. 适合 C++ 新手学习的开源项目——在 GitHub 学编程
  11. android中实现内容搜索
  12. Oracle 启动失败报错“TNS-12555: TNS:permission denied”解决办法
  13. D3D9 简单图形的绘制以及显示
  14. 构建orangePi r1 plus (RK3328)系统的整个过程
  15. python实时股票数据折线图_股票分笔成交数据导出,python实时股票数据
  16. 软件测试周刊(第29期):找回我的「没有理由就是开心」
  17. 【硬件】对电源模块的梳理2.0(含LDO参数详解、DCDC参考设计)
  18. linux使用光盘恢复系统,方正电脑操作系统恢复光盘linux桌面5怎么用 具体点
  19. java程序设计第三版课后答案张思民
  20. 面试官再问你优先级队列,请把这篇文章丢给他

热门文章

  1. 在以下说法错误的是_外行人对翡翠有哪些错误认知?行家给你最精准的答案
  2. leetcode367. 有效的完全平方数
  3. Mysql中group by 使用中发现的问题
  4. 高等数学下-赵立军-北京大学出版社-题解-练习10.1
  5. [Java基础]线程同步之卖票案列分析
  6. LeetCode 142环形链表||-中等
  7. [蓝桥杯]字母组串-递归
  8. ubuntu 安装 cuda
  9. python打印数组中期望元素的位置
  10. 网络编程——常用协议解析