[bzoj2724]蒲公英

分块,可以发现众数一定是整块的众数或在不整块中出现的数,预处理出f[i][j]表示第i块到第j块的众数,然后对于询问暴力枚举所有散块的数,相当于要支持查询一个数在一个区间内出现的次数,可以用可持久化权值线段树,也可以直接对每一个数开一个vector记录位置二分(离散),时间复杂度是$o(nKlog_{2}n+n^{2}/K)$,取$K=sqrt(n/log_{2}n)$即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define K 205
 4 #define N 40005
 5 #define bl(k) ((k-1)/K)
 6 struct ji{
 7     int id,s;
 8     bool operator < (const ji &a)const{
 9         return (s<a.s)||(s==a.s)&&(id>a.id);
10     }
11 }ans,f[K][K];
12 vector<int>v[N];
13 int n,m,l,r,a[N],b[N],vis[N];
14 int query(int k,int l,int r){
15     return upper_bound(v[k].begin(),v[k].end(),r)-lower_bound(v[k].begin(),v[k].end(),l);
16 }
17 int main(){
18     scanf("%d%d",&n,&m);
19     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
20     memcpy(b,a,sizeof(b));
21     sort(b+1,b+n+1);
22     for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+n+1,a[i])-b;
23     for(int i=1;i<=n;i++)v[a[i]].push_back(i);
24     for(int i=0;i<=bl(n);i++){
25         memset(vis,0,sizeof(vis));
26         for(int j=i*K+1;j<=n;j++)
27             f[i][bl(j)]=max(f[i][bl(j)],ji{a[j],++vis[a[j]]});
28         for(int j=i+1;j<=bl(n);j++)f[i][j]=max(f[i][j],f[i][j-1]);
29     }
30     for(int i=1;i<=m;i++){
31         scanf("%d%d",&l,&r);
32         l=(l+b[ans.id]-1)%n+1;
33         r=(r+b[ans.id]-1)%n+1;
34         if (l>r)swap(l,r);
35         ans=f[bl(l)+1][bl(r)-1];
36         for(int j=l;j<=min(bl(l)*K+K,r);j++)ans=max(ans,ji{a[j],query(a[j],l,r)});
37         if (bl(l)!=bl(r))
38             for(int j=bl(r)*K+1;j<=r;j++)ans=max(ans,ji{a[j],query(a[j],l,r)});
39         printf("%d\n",b[ans.id]);
40     }
41 }

原文地址:https://www.cnblogs.com/PYWBKTDA/p/11371424.html

时间: 2024-10-18 10:41:49

[bzoj2724]蒲公英的相关文章

[日常摸鱼]bzoj2724蒲公英-分块

区间众数经典题~ http://begin.lydsy.com/JudgeOnline/problem.php?id=4839这里可以提交~ 题意大概就是没有修改的询问区间众数,如果有一样的输出最小的,强制在线,$n \leq 4*10^4,a_i \leq 10^9$. log数据结构脑补一遍好像没什么可以做的,数据范围我们可以分块! 不过分块之前肯定要离散化一下,而且还要保存离散化前的数据(因为要回答的是出现最多的数),离散化的方法在上一篇博客里面~ 假设分成$L$块,每块大小$s=\lfl

【BZOJ2724】[Violet 6]蒲公英 分块+二分

[BZOJ2724][Violet 6]蒲公英 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 <= 40000, m <= 50000 题解:分块还是练脑子啊~ 结论:一个区间的众数要么是区间中一个块的众数,要么是块外的任意

BZOJ2724: [Violet 6]蒲公英

2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 795  Solved: 248[Submit][Status] Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 Output Sample Input Sample Output HINT 修正下: n <= 40000, m <= 50000 S

【bzoj2724】蒲公英(分块)

题目分析 付费题哈哈.题意就是求区间众数,由于区间众数无法快速合并,所以不能使用传统的数据结构如线段树等. 这时分块就能派上很大的用场.将序列分成$\sqrt{n}+$块,每块大小$\sqrt{n}+$,通过预处理得到cnt[i][j], ans[i][j]分别表示i在前j块中出现的次数,和第i块到第j块的众数是多少. 那么查询时我们就得到了至多$\sqrt{n}$个连续的块,和至多$2\sqrt{n}$个零散的元素,对于零散的元素,暴力,对于连续的块,直接使用预处理. code #includ

【bzoj2724】[Violet 6]蒲公英 分块+STL-vector

题目描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 样例输入 6 3 1 2 3 2 1 2 1 5 3 6 1 5 样例输出 1 2 1 题解 分块+STL-vector 一个显而易见的结论:区间众数一定是一段连续的块的众数或块外的数,证明略(逃 先把数据离散化,然后分块预处理出f[i][j],表示从块i到块j的众数位置.具体实现的话直接开个桶存一下就好了. 然后考虑询问,整块的直接拿出来求一下出现次

【分块】bzoj2724 [Violet 6]蒲公英

分块,离散化,预处理出: ①前i块中x出现的次数(差分): ②第i块到第j块中的众数是谁,出现了多少次. 询问的时候,对于整块的部分直接获得答案:对于零散的部分,暴力统计每个数出现的次数,加上差分的结果,尝试更新ans. 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int n,m,sum,sz,n

bzoj2724: [Violet 6]蒲公英(离散化+分块)

我好弱啊..这题调了2天QwQ 题目大意:给定一个长度为n(n<=40000)的序列,m(m<=50000)次询问l~r之间出现次数最多的数.(区间众数) 这题如果用主席树就可以不用处理一堆前缀和..蓝鹅我不会~T_T~. 把序列n分成sqrt(n)块,先把所有数离散化,预处理出poi[i][j]表示第i块到第j块的众数(即出现次数最多的数). 询问有两种情况: 第一种情况是l~r在某个块中,那么直接扫一遍求出众数,效率O(sqrt(n)). 第二种情况是l~r在多个块中,l在x块,r在y块,

bzoj2724: [Violet 6]蒲公英(分块)

传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间没有开小就更美了) 我们先将整个数组分块,设块的大小为$T$ 我们先预处理出所有以块边界为端点的区间的答案,即$ans[L][R]$代表着第$L$块到第$R$块的序列所代表的答案.这个可以$O(n*n/T)$预处理 然后我们先将所有的数给离散化,然后对每一个值都开一个vector,记录这个值在数组中

蒲公英之旅

大家大概都听说过花生壳是做域名解析的,但是花生壳最近却新推出了一款名叫"蒲公英"路由器,号称企业级智能组网路由器,以VPC组网技术为特色,听起来像那么回事,忍不住要自己动手来亲自测试一番. 1.配置情况 我们先看看配置. 硬件配置 处理器(CPU): MT7620A 内存(RAM): 128MB 闪存(FLASH): 16MB 接口 1个标准Micro USB 2.0电源接口 1个自适应10/100Mbps WAN口 3个自适应10/100Mbps LAN口 网络性能 无线网络标准: