洛谷 P4168 [Violet] 蒲公英
历尽千辛万苦终于AC了这道题目。。。
我们考虑1个区间\([l,r]\),
被其完整包含的块的区间为\([L,R]\)
那么众数的来源?
1.\([l,L)\)或\((R,r]\)中出现的数字
2.\([L,R]\)中的众数
思路逐渐清晰起来
我们考虑维护这样的两个量
\(P[i][j]\)表示从第i块到第j块的区间(最小)众数
\(S[i][j]\)表示前i块中j的出现次数
先直接离散化或者hash或者unordered_map处理,然后维护
结合刚才的思路,不难得到:
1.求出\([l,L)\)或\((R,r]\)中出现的数字的出现次数
2.求出\([L,R]\)中的众数的出现次数
3.进行比较判断
4.完结撒花!!!
贴一个可见度并不高的代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=6e4+10;
int alpha=3;
unordered_map<int,int> p,q;//双向映射
int tot,n,m,len;
int b[maxn];
int num[maxn];
int mode[500][500];
int s[500][maxn];
int t[maxn],vis[maxn];//用于处理询问
void init()
{
for(int i=1;i<=b[n];++i)
{
memset(vis,0,sizeof vis);
int tmp=1999999999,nu=0;
for(int j=i;j<=b[n];++j)
{
for(int k=(j-1)*len+1;k<=min(n,j*len);++k)
{
++vis[num[k]];
if(vis[num[k]]==nu&&p[num[k]]<tmp)
tmp=p[num[k]],nu=vis[num[k]];
else if(vis[num[k]]>nu)
tmp=p[num[k]],nu=vis[num[k]];
}
mode[i][j]=q[tmp];
}
}//维护第i块到第j块的区间众数
for(int i=1;i<=b[n];++i)
{
for(int j=1;j<=n;++j)
s[i][num[j]]=s[i-1][num[j]];
for(int j=(i-1)*len+1;j<=min(n,i*len);++j)
++s[i][num[j]];
}
}
int solve(int l,int r)
{
if(b[r]-b[l]<=alpha)
{
int tmp=1999999999,nu=0;
for(int i=l;i<=r;++i)
t[num[i]]=0;
for(int i=l;i<=r;++i)
{
++t[num[i]];
if(t[num[i]]==nu&&p[num[i]]<tmp)
tmp=p[num[i]],nu=t[num[i]];
else if(t[num[i]]>nu)
tmp=p[num[i]],nu=t[num[i]];
}
return tmp;
}
t[mode[b[l]+1][b[r]-1]]=0;
vis[mode[b[l]+1][b[r]-1]]=0;
for(int i=l;i<=min(n,b[l]*len);++i)
t[num[i]]=0,vis[num[i]]=0;
for(int i=r;i>=(b[r]-1)*len+1;--i)
t[num[i]]=0,vis[num[i]]=0;
for(int i=l;i<=min(n,b[l]*len);++i) ++t[num[i]];
for(int i=r;i>=(b[r]-1)*len+1;--i) ++t[num[i]];
int tmp=0,nu=0;
for(int i=l;i<=min(n,(b[l])*len);++i)
{
if(!vis[num[i]])
{
vis[num[i]]=1;
int qaq=s[b[r]-1][num[i]]-s[b[l]][num[i]]+t[num[i]];
if(qaq==nu&&p[num[i]]<tmp)
tmp=p[num[i]],nu=qaq;
else if(qaq>nu)
tmp=p[num[i]],nu=qaq;
}
}
for(int i=r;i>=(b[r]-1)*len+1;--i)
{
if(!vis[num[i]])
{
vis[num[i]]=1;
int qaq=s[b[r]-1][num[i]]-s[b[l]][num[i]]+t[num[i]];
if(qaq==nu&&p[num[i]]<tmp)
tmp=p[num[i]],nu=qaq;
else if(qaq>nu)
tmp=p[num[i]],nu=qaq;
}
}
int qwq=mode[b[l]+1][b[r]-1];
if(nu<s[b[r]-1][qwq]-s[b[l]][qwq]+t[qwq]) return p[qwq];
else if(nu==s[b[r]-1][qwq]-s[b[l]][qwq]+t[qwq]) return min(p[qwq],tmp);
return tmp;
}
int main()
{
// freopen("test.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
int tmp;
scanf("%d",&tmp);
if(!q[tmp])
++tot,q[tmp]=tot,num[i]=tot,p[tot]=tmp;
else num[i]=q[tmp];
}
len=sqrt(n);
for(int i=1;i<=n;++i)
b[i]=(i-1)/len+1;
init();
int l0,r0,lst=0;
for(int i=1;i<=m;++i)
{
scanf("%d%d",&l0,&r0);
int l=(l0+lst-1)%n+1,r=(r0+lst-1)%n+1;
if(l>r) swap(l,r);
lst=solve(l,r);
printf("%d\n",lst);
}
return 0;
}
洛谷 P4168 [Violet] 蒲公英的更多相关文章
- 洛谷 P4168 [Violet]蒲公英 解题报告
P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...
- [洛谷P4168][Violet]蒲公英
题目大意:有$n(n\leqslant4\times10^4)$个数,$m(m\leqslant5\times10^4)$个询问,每次问区间$[l,r]$内的众数,若相同输出最小的,强制在线. 题解: ...
- 「分块系列」「洛谷P4168 [Violet]」蒲公英 解题报告
蒲公英 Description 我们把所有的蒲公英看成一个长度为\(n\)的序列(\(a_1,a_2,...a_n\)),其中\(a_i\)为一个正整数,表示第i棵蒲公英的种类的编号. 每次询问一个区 ...
- 洛谷P1445 [Violet] 樱花 (数学)
洛谷P1445 [Violet] 樱花 题目背景 我很愤怒 题目描述 求方程 1/X+1/Y=1/(N!) 的正整数解的组数,其中N≤10^6. 解的组数,应模1e9+7. 输入输出格式 输入格式: ...
- 洛谷P4168 蒲公英 分块处理区间众数模板
题面. 许久以前我还不怎么去机房的时候,一位大佬好像一直在做这道题,他称这道题目为"大分块". 其实这道题目的思想不只可以用于处理区间众数,还可以处理很多区间数值相关问题. 让我们 ...
- BZOJ2721或洛谷1445 [Violet]樱花
BZOJ原题链接 洛谷原题链接 其实推导很简单,只不过我太菜了想不到...又双叒叕去看题解 简单写下推导过程. 原方程:\[\dfrac{1}{x} + \dfrac{1}{y} = \dfrac{1 ...
- 【题解】洛谷P1445 [Violet]樱花 (推导+约数和)
洛谷P1445:https://www.luogu.org/problemnew/show/P1445 推导过程 1/x+1/y=1/n! 设y=n!+k(k∈N∗) 1/x+1/(n!+k)=1 ...
- 洛谷P4168 蒲公英 [Violet] 分块
题解:分块+离散化 解题报告: 一个分块典型题呢qwq还是挺妙的毕竟是道黑题 然,然后发现忘记放链接了先放链接QAQ 有两三种解法,都港下qwq 第一个是O(n5/3)的复杂度,谢总说不够优秀没有港, ...
- 【洛谷 P4168】[Violet]蒲公英(分块)
题目链接 题目大意:给定\(n\)个数和\(m\)个求区间众数的询问,强制在线 这题我\(debug\)了整整一个下午啊..-_- 从14:30~16:45终于\(debug\)出来了,\(debug ...
随机推荐
- IntelliJ IDEA下如何设置JSP模板
今天在学习Spring MVC知识时,发现自己所用的IntelliJ IDEA中自动生成的JSP文件不支持EL表达式的使用,所以就想导入新的JSP模板,方便以后使用.根据旧模板的提示,如下图 找到Se ...
- 通用mapper认识和用法
目录 0. 认识 1. 导包 2. mybatis的config文件:mybatis-mapper-config.xml 3. spring与mybatis整合配置文件:mybatis.xml 4. ...
- windows系统 docker + swoole 操作
之前文章讲过在windows系统安装 cgywin 从而安装swoole扩展的操作,但是安装cgywin的时候会出现这样那样的问题.所以今天记录下另一种方式使用docker 安装 swoole 环境! ...
- 前端入门23-CSS预处理器(Less&Sass)
声明 本篇内容梳理自以下几个来源: Github:smyhvae/web Bootstrap网站的 less 文档 Sass中文网 感谢大佬们的分享. 正文-CSS预处理(less&Sass) ...
- 基于Html5 Plus + Vue + Mui 移动App开发(三)-文件操作(读取、保存、更新数据)
随着手机的发展,现在越来越多的人选择在手机上看书.无论是专业书籍.文学.英语还是网络小说,在手机上看新闻成了人们处理零碎时间的办法.在智能手机里安装一个资讯APP,可以随时.随地查看自己想看的资讯 ...
- 华为6.0系统设备最完美激活Xposed框架的经验
对于喜欢玩手机的伙伴而言,经常会使用上Xposed框架及种种功能强大的模块,对于5.0以下的系统版本,只要手机能获得root权限,安装和激活Xposed框架是非常轻松的,但随着系统版本的迭代,5.0以 ...
- Android远程桌面助手(B1309)
修改了窗口缩放的处理,支持Android Car等非常规分辨率的Android设备: 修改了获取Android端软件版本的方法,优化了APK的升级逻辑: 优化了远程输入法功能,支持利用PC端输入法快速 ...
- pyspider安装提示:got an unexpected keyword argument 'io_loop'的解决办法
此问题解决办法学习自pyspider的github的issues 原地址:https://github.com/binux/pyspider/issues/771 解决方法: 由于最新版的Tornad ...
- js用canvans 实现简单的粒子运动
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- SQL Server 增加链接服务器
exec sp_addlinkedserver '名称' , '' , 'SQLOLEDB' , '10.102.29.xxx' exec sp_addlinkedsrvlogin '名称' , 'f ...