[luogu 4168] [Violet]蒲公英 {离散化+分块}
题目
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]蒲公英 {离散化+分块}相关推荐
- 【题解】洛谷P4168 [Violet]蒲公英 (分块)
[题解]洛谷P4168 [Violet]蒲公英 (分块) D e s c r i p t i o n \rm Description Description 我们把所有的蒲公英看成一个长度为 ...
- Luogu P4168 [Violet]蒲公英(分块)
P4168 [Violet]蒲公英 题意 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还 ...
- Luogu P4168 [Violet]蒲公英 分块
这道题算是好好写了.写了三种方法. 有一个好像是$qwq$$N\sqrt(N)$的方法,,但是恳请大佬们帮我看看为什么这么慢$qwq$(后面的第三种) 注:$pos[i]$表示$i$属于第$pos[i ...
- 洛谷4168 [Violet]蒲公英
标签:分块 题目 题目传送门 背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被 ...
- p4168 蒲公英(离散化+分块+前缀和)
[洛谷p4168 蒲公英] 这是蒻蒻写的第一道紫题,必须记住这个时刻. 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说 ...
- 【洛谷 P4168】[Violet]蒲公英(分块)
题目链接 题目大意:给定\(n\)个数和\(m\)个求区间众数的询问,强制在线 这题我\(debug\)了整整一个下午啊..-_- 从14:30~16:45终于\(debug\)出来了,\(debug ...
- [Violet]蒲公英(分块)
题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕 ...
- LUOGU P4168 [Violet]蒲公英
传送门 解题思路 分块码农题,设分成T块,cnt[i][j][k]表示第i块到第j块,k出现的次数,需要离散化.all[i][j] 表示第i块到第j块的众数.然后这两个数组先预处理出来.然后询问的时候 ...
- 洛谷 P4168 [Violet]蒲公英 解题报告
P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...
最新文章
- 作业3.1:沟通管理计划包括哪些内容
- 修复Chrome上的ERR_TOO_MANY_REDIRECTS错误?
- 14.parfor并行循环处理
- 8工具来优化你的图像
- 知道 Hardtop 就够了?这九项必备技术你也必须掌握!
- c语言怎样用vc绘图,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
- OpenGL超级宝典 纹理(一)
- STM32与FPGA Cyclone IV芯片fsmc通信
- 在校学生适合的云服务器有哪些?
- 一大波能提高编程技能的游戏
- iRingg 1.0.48 iPhone铃声制作
- 脉冲宽度调制(Pluse Width Modulation)
- Ubuntu搭建CTFd平台实现动态靶机的过程
- 厂长来了 | 从个人英雄到软件工程,我们经历了什么
- c语言电流检测模块程序,C语言和MATLAB程序设计在电力谐波电流检测方法仿真中的应用...
- 超过4G如何制作NTFS格式WINPE?
- 【转】机器学习和神经科学:你的大脑也在进行深度学习吗?
- 9.20 度小满笔试
- 【LeetCode】1405-最长快乐字符串
- 『Python学习笔记』Python实现并发编程(补充joblibpymysql)
热门文章
- C++中erase()函数
- 郭继孚谈北京地铁“预约出行”
- java开发在线打开编辑保存word文件
- 车联网智能终端T-Box车联网智能终端远程控制T-B0X配置4G LTE的0BD设备
- Make a Face: Towards Arbitrary High Fidelity Face Manipulation(做个脸:走向任意高保真脸部操纵)
- 大数据软件排名,国内大数据企业排名
- 银行卡四元素校验API 验证姓名手机号码身份证号码银行卡号是否一致
- 44-验证的周期、45-验证管理的三要素
- gimp练习:Disintegration Effect
- windows server2021 R2 由于没有远程桌面授权服务器可以提供许可证,远程会话被中断