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

区间众数

金牌导航 分块-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^91N4×104,1M5×104,1ai109

解题思路

对于求区间众数,线段树不易维护
考虑分块
先对数列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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF235C-Cyclical Quest【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/CF235C 题目大意 一个文本串sss。询问nnn个匹配的本质不同的循环同构在文本串中出现了几次。 解题思路 我们匹配完原串之后&#xff0c;相当与每次在头部删去一个字符然后又在末尾加上一个字符。使用SAMSAMSAM匹配的话&…

离散大创项目——图片识别笔记

1.我才知道ainput()读入的竟然是字符串。。。还要强制转化成int型&#xff0c;这玩意搞了我好久 2.对照片进行裁剪&#xff0c;将照片周围多余的白色部分去除&#xff08;也就是让图像尽可能撑满整个框&#xff09; 由上一张裁成下一张 from PIL import Image import os SCA…

最小割小记

参考博客&#xff1a;最小割浅谈 关于最小割 常用描述 表述一&#xff1a;删去若干条边使得源点到汇点不连通&#xff0c;求删边的权值和的最小可能值。 表述二&#xff1a;将点集分为(S,T)(S,T)(S,T)&#xff0c;记所有从SSS中出发到TTT中的边的权值和为c(S,T)c(S,T)c(S,T)&a…

CF204E-Little Elephant and Strings【广义SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/CF204E 题目大意 nnn个字符串的一个字符串集合&#xff0c;对于每个字符串求有多少个子串是这个字符串集合中至少kkk个字符串的子串。 解题思路 因为对于每个字符串我们需要维护的信息不同&#xff0c;不能累加&#xff0c;所…

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

区间不同数 金牌导航 莫队-1 题目大意 给出n个数&#xff0c;然后询问m次&#xff0c;每次询问一个区间内不同的数的个数 样例输入 6 1 2 3 4 3 5 3 1 2 3 5 2 6样例输出 2 2 4数据范围 1⩽n⩽5104,1⩽m⩽2105,0⩽ai⩽1061\leqslant n\leqslant 5\times 10^4,1\leqslant …

斐波那契数列求法

文章目录求斐波那切数列的几个方法&#xff1a;经典做法&#xff1a;递推&#xff1a;动态规划矩阵快速幂原理&#xff1a;代码&#xff1a;例题&#xff1a;模拟过程求斐波那切数列的几个方法&#xff1a; 经典做法&#xff1a; 众所周知&#xff1a;斐波那契数列的定义是f(…

ASP.Net Core2.1中的HttpClientFactory系列一

引言&#xff1a;ASP.NET Core2.1 中出现了一个新的 HttpClientFactory 功能, 它有助于解决开发人员在使用 HttpClient 实例从其应用程序中访问外部 web 资源时可能遇到的一些常见问题。关于HttpClientFactory 到底解决了那些HttpClient的严重问题&#xff0c;下面是我罗列出来…

欧拉回路哈密顿回路

欧拉回路 总结 百度百科 混合图的欧拉回路 Fleury算法 Hierholzer算法 //寻找无向图的欧拉路径 #include<iostream> #include<vector> #include<stack> using namespace std; vector<int> g[1001]; int n,m,x,y,d[1001],s-1,t-1; bool vis[1001][100…

【CDQ分治】三维偏序(luogu 3801/金牌导航 CDQ分治-1)

三维偏序 luogu 3801 金牌导航 CDQ分治-1 题目大意 有n个元素&#xff0c;第i个元素有ai,bi,cia_i,b_i,c_iai​,bi​,ci​三个属性&#xff0c;设 f(i)表示满足aj⩽aia_j\leqslant a_iaj​⩽ai​且bj⩽bib_j \leqslant b_ibj​⩽bi​且cj⩽cic_j \leqslant c_icj​⩽ci​且…

P4929-[模板]舞蹈链(DLX)

正题 题目链接:https://www.luogu.com.cn/problem/P4929 题目大意 n∗mn*mn∗m的矩形有0/10/10/1&#xff0c;要求选出若干行使得每一列有且仅有一个111。 解题思路 精确覆盖问题指的是一个集合SSS和它的若干个子集集合TTT&#xff0c;要求选出TTT的一个子集使得里面的集合元…

最大子矩阵(普通和01)

文章目录普通矩阵&#xff08;单个矩阵值为任何数&#xff09;最大子段和扩展到二维情况01矩阵&#xff08;单个矩阵值为0或1&#xff09;代码&#xff1a;普通矩阵&#xff08;单个矩阵值为任何数&#xff09; 例题&#xff1a;POJ 1074 求出其中最大的子矩阵 答案是&#x…

自动化流程开源框架BotSharp

BotSharp是一款为方便构建智能对话机器人平台而开发的开源框架&#xff0c;最大的特点是所有模型算法都是基于.NET Core开发实现&#xff0c;甚至最基本的Penn Treebank分词标准&#xff0c;都重新用C#实现了。在机器学习python占绝对优势的时代算是不可多得的项目。该项目涉及…

二分图匹配

定义&#xff1a; 二分图&#xff1a;一个图被分成了两部分&#xff0c;相同的部分没有边 匹配&#xff1a;二分图G的子图M中&#xff0c;M的边集{E}中的任意两条边都不指向同一个顶点 极大匹配&#xff1a;在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹…

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

区间第k小 金牌导航 整体二分-1 题目大意 给出一个序列&#xff0c;有若干查询&#xff0c;每次查询给出l,r,k&#xff0c;让你求l~r这个区间的第k大 输入样例 7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3输出样例 5 6 3数据范围 1⩽n⩽105,1⩽m⩽50000,1⩽∣ai∣⩽1091\leqsla…

积极参与开源项目,促进.NET Core生态社区发展

今天早上在微信群里聊天聊到百度的SDK 已经支持.NET Core, 百度已经在3月份就支持了&#xff0c;想起当时还是我在他们的github上提的issue&#xff1a; https://github.com/Baidu-AIP/dotnet-sdk/issues/3。.NET Core生态社区的发展已经四年多时间&#xff0c;日趋完善&#x…

P6091-[模板]原根

正题 题目链接:https://www.luogu.com.cn/problem/P6091 题目大意 给出一个数ppp&#xff0c;求出它的所有在[0,p][0,p][0,p]的原根。 解题思路 原根的定义&#xff0c;δp(a)\delta_p(a)δp​(a)表示一个最小的nnn使得an≡1(modp)a^n\equiv1(mod\ p)an≡1(mod p)&#xff0…

并查集小记

有什么用&#xff1a; 查询元素a和元素b是否属于同一组 合并元素a和元素b所在组 代码实现&#xff1a; #include<iostream> using namespace std; int n,m,p; int fa[5001]; int find(int x){if(fa[x]x) return x;else{return fa[x]find(fa[x]);} } int main(){cin&g…

Poj 1011 UVA - 307 Sticks

牛客网 poj 1011 题目&#xff1a; George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long th…

HAPPY2020暑假训练前复习

A.计蒜客 - T1381 输出hello world 万恶之源 B.51Nod - 2060 全排列输出 不要用STL的next_permutation,会超时 #include <bits/stdc.h> using namespace std; const int maxn14; int dt[maxn]; int vis[maxn];int n; void dfs(int depth) {if(depthn){for(int i0;; i…

【LCT】洞穴勘测(luogu 2147/金牌导航 LCT-1)

洞穴勘测 luogu 2147 金牌导航 LCT-1 题目大意 给你若干操作&#xff0c;有三种操作&#xff1a; 1.连接两个点 2.吧两个点之间的连边断掉&#xff08;保证有这条边&#xff09; 3.查询两个点之间是否连通 样例 #1 输入样例 #1 200 5 Query 123 127 Connect 123 127 Que…