题目

https://www.luogu.org/problem/P4168


解题思路

先离散化。

一个区间的最多众数显然是在中间的块或者是旁边的两个块的众数。
我们可以花O(T2n)O(T^2n)O(T2n)的复杂度先预处理好每两个块之间的众数。


代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define rep(i,x,y) for (register int i=x;i<=y;i++)
using namespace std;
const int N=50001;
int n,m,tot,a[N],b[N],c[40][40][N],M[40][40][2],be[N],pos[N],last,L[40],R[40],T,len,sum[N];
int ask(int x,int y){int ans=0,maxn=0,q=pos[x],p=pos[y];  if (p-q<=1){memset(sum,0,sizeof(sum)); rep(i,x,y){sum[a[i]]++; if (sum[a[i]]>maxn||(sum[a[i]]==maxn&&a[i]<ans)){maxn=sum[a[i]]; ans=a[i]; }}return ans; }maxn=M[q+1][p-1][0],ans=M[q+1][p-1][1]; rep(i,x,R[q]){c[q+1][p-1][a[i]]++; if (c[q+1][p-1][a[i]]>maxn||(c[q+1][p-1][a[i]]==maxn&&a[i]<ans)){maxn=c[q+1][p-1][a[i]]; ans=a[i]; }}rep(i,L[p],y){c[q+1][p-1][a[i]]++; if (c[q+1][p-1][a[i]]>maxn||(c[q+1][p-1][a[i]]==maxn&&a[i]<ans)){maxn=c[q+1][p-1][a[i]]; ans=a[i]; }}rep(i,x,R[q]) c[q+1][p-1][a[i]]--; rep(i,L[p],y) c[q+1][p-1][a[i]]--; return ans;
}
int main(){scanf("%d%d",&n,&m); rep(i,1,n) scanf("%d",&a[i]),b[i]=a[i]; sort(b+1,b+n+1); tot=unique(b+1,b+n+1)-b-1; rep(i,1,n) {int x=lower_bound(b+1,b+tot+1,a[i])-b; be[x]=a[i]; a[i]=x;}T=(int)pow(double(n),1.0/3.0);len=n/T; if (T*len<n) T++; rep(i,1,T){L[i]=R[i-1]+1; R[i]=min(i*len,n); rep(j,L[i],R[i]){c[i][i][a[j]]++; if (c[i][i][a[j]]>M[i][i][0]||(c[i][i][a[j]]==M[i][i][0]&&a[j]<M[i][i][1])){M[i][i][0]=c[i][i][a[j]]; M[i][i][1]=a[j]; }pos[j]=i; }}rep(k,1,T-1) rep(i,1,T-k){int j=i+k,mid=(i+j)/2; rep(l,1,tot){c[i][j][l]=c[i][mid][l]+c[mid+1][j][l]; if (c[i][j][l]>M[i][j][0]){M[i][j][0]=c[i][j][l]; M[i][j][1]=l; }}}int x,y; while(m--){scanf("%d%d",&x,&y); x=(last+x-1)%n+1,y=(last+y-1)%n+1; if (x>y) swap(x,y); last=be[ask(x,y)]; printf("%d\n",last); }
}

[luogu 4168] [Violet]蒲公英 {离散化+分块}相关推荐

  1. 【题解】洛谷P4168 [Violet]蒲公英 (分块)

    [题解]洛谷P4168 [Violet]蒲公英 (分块)     D e s c r i p t i o n \rm Description Description 我们把所有的蒲公英看成一个长度为 ...

  2. Luogu P4168 [Violet]蒲公英(分块)

    P4168 [Violet]蒲公英 题意 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还 ...

  3. Luogu P4168 [Violet]蒲公英 分块

    这道题算是好好写了.写了三种方法. 有一个好像是$qwq$$N\sqrt(N)$的方法,,但是恳请大佬们帮我看看为什么这么慢$qwq$(后面的第三种) 注:$pos[i]$表示$i$属于第$pos[i ...

  4. 洛谷4168 [Violet]蒲公英

    标签:分块 题目 题目传送门 背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被 ...

  5. p4168 蒲公英(离散化+分块+前缀和)

    [洛谷p4168 蒲公英] 这是蒻蒻写的第一道紫题,必须记住这个时刻. 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说 ...

  6. 【洛谷 P4168】[Violet]蒲公英(分块)

    题目链接 题目大意:给定\(n\)个数和\(m\)个求区间众数的询问,强制在线 这题我\(debug\)了整整一个下午啊..-_- 从14:30~16:45终于\(debug\)出来了,\(debug ...

  7. [Violet]蒲公英(分块)

    题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕 ...

  8. LUOGU P4168 [Violet]蒲公英

    传送门 解题思路 分块码农题,设分成T块,cnt[i][j][k]表示第i块到第j块,k出现的次数,需要离散化.all[i][j] 表示第i块到第j块的众数.然后这两个数组先预处理出来.然后询问的时候 ...

  9. 洛谷 P4168 [Violet]蒲公英 解题报告

    P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...

最新文章

  1. 作业3.1:沟通管理计划包括哪些内容
  2. 修复Chrome上的ERR_TOO_MANY_REDIRECTS错误?
  3. 14.parfor并行循环处理
  4. 8工具来优化你的图像
  5. 知道 Hardtop 就够了?这九项必备技术你也必须掌握!
  6. c语言怎样用vc绘图,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  7. OpenGL超级宝典 纹理(一)
  8. STM32与FPGA Cyclone IV芯片fsmc通信
  9. 在校学生适合的云服务器有哪些?
  10. 一大波能提高编程技能的游戏
  11. iRingg 1.0.48 iPhone铃声制作
  12. 脉冲宽度调制(Pluse Width Modulation)
  13. Ubuntu搭建CTFd平台实现动态靶机的过程
  14. 厂长来了 | 从个人英雄到软件工程,我们经历了什么
  15. c语言电流检测模块程序,C语言和MATLAB程序设计在电力谐波电流检测方法仿真中的应用...
  16. 超过4G如何制作NTFS格式WINPE?
  17. 【转】机器学习和神经科学:你的大脑也在进行深度学习吗?
  18. 9.20 度小满笔试
  19. 【LeetCode】1405-最长快乐字符串
  20. 『Python学习笔记』Python实现并发编程(补充joblibpymysql)

热门文章

  1. C++中erase()函数
  2. 郭继孚谈北京地铁“预约出行”
  3. java开发在线打开编辑保存word文件
  4. 车联网智能终端T-Box车联网智能终端远程控制T-B0X配置4G LTE的0BD设备
  5. Make a Face: Towards Arbitrary High Fidelity Face Manipulation(做个脸:走向任意高保真脸部操纵)
  6. 大数据软件排名,国内大数据企业排名
  7. 银行卡四元素校验API 验证姓名手机号码身份证号码银行卡号是否一致
  8. 44-验证的周期、45-验证管理的三要素
  9. gimp练习:Disintegration Effect
  10. windows server2021 R2 由于没有远程桌面授权服务器可以提供许可证,远程会话被中断