博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构:分块-区间众数查询
阅读量:4956 次
发布时间:2019-06-12

本文共 1800 字,大约阅读时间需要 6 分钟。

这里只支持查询不支持修改,总的时间复杂度为O((n+q)*√n)

1 #include
2 #include
3 #include
4 using namespace std; 5 const int maxn=100005; 6 int n,m,blo; 7 int a[maxn],t[maxn],bl[maxn]; 8 int cnt[505][maxn],f[505][505]; 9 //cnt[i][j]表示[0,i]块上数字j的数量 10 //f[i][j]表示第i块到第j块的众数是几 11 inline long long read() 12 { 13 long long x=0,f=1;char ch=getchar(); 14 while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} 15 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 16 return x*f; 17 } 18 void init() 19 { 20 for(int i=1;i<=bl[n];i++) 21 { 22 for(int j=1;j<=m;j++) 23 cnt[i][j]+=cnt[i-1][j]; 24 } 25 for(int i=1;i<=bl[n];i++) 26 { 27 int num[maxn]; 28 int mode=0; 29 int mx=0; 30 for(int k=1;k<=m;k++) num[k]=0; 31 for(int j=(i-1)*blo+1;j<=n;j++) 32 { 33 num[a[j]]++; 34 if(num[a[j]]>mx||(num[a[j]]==mx&&mode>a[j])) 35 { 36 mode=a[j]; 37 mx=num[a[j]]; 38 } 39 f[i][bl[j]]=mode; 40 } 41 } 42 } 43 void force(int l,int r) 44 { 45 int num[maxn]; 46 int mode=0; 47 int mx=0; 48 for(int i=1;i<=m;i++) num[i]=0; 49 for(int i=l;i<=r;i++) 50 { 51 num[a[i]]++; 52 if(num[a[i]]>mx||(num[a[i]]==mx&&mode>a[i])) 53 { 54 mode=a[i]; 55 mx=num[a[i]]; 56 } 57 } 58 printf("%d\n",t[mode]); 59 } 60 void solve(int t1,int t2,int l,int r,int *num,int &mode,int &mx) 61 { 62 for(int i=l;i<=r;i++) 63 { 64 num[a[i]]++; 65 int tmp=num[a[i]]+cnt[t2-1][a[i]]-cnt[t1][a[i]]; 66 if(tmp>mx||(tmp==mx&&a[i]

 

转载于:https://www.cnblogs.com/aininot260/p/9530332.html

你可能感兴趣的文章
PHPCMS V9{loop subcat(0,0,0,$siteid) $r}怎么解释?
查看>>
避免内存重叠memmove()性能
查看>>
【ASP.NET】从服务器端注册客户端脚本
查看>>
Infix to Postfix Expression
查看>>
SELECT LOCK IN SHARE MODE and FOR UPDATE
查看>>
Perl/Nagios – Can’t locate utils.pm in @INC
查看>>
目录导航「深入浅出ASP.NET Core系列」
查看>>
简易爬虫(爬取本地数据)
查看>>
python 进程间通信
查看>>
深拷贝 vs 浅拷贝 释放多次
查看>>
Javascript 有用参考函数
查看>>
点群的判别(三)
查看>>
GNSS 使用DFT算法 能量损耗仿真
查看>>
【转】Simulink模型架构指导
查看>>
MYSQL数据库的导出的几种方法
查看>>
SQL Server-5种常见的约束
查看>>
硬件之美
查看>>
[转载]java开发中的23种设计模式
查看>>
表格的拖拽功能
查看>>
函数的形参和实参
查看>>