洛谷 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 ...
随机推荐
- 演示Eclipse插件实现代码提示和补全
续上文重拾< 两周自制脚本语言 >- Eclipse插件实现语法高亮, 但仅达到了演示Eclipse本身功能的程度, 与石头语言并无直接联系. 源码库相同, 仍在同一插件. 演示效果如下: ...
- 解决PostGIS打开shp文件输入输出模块出现"找不到文件libintl-9.dll"的问题
找到shp2pgsql-gui.exe这个程序的目录 复制一份libintl-8.dll副本,改名为libintl-9.dll即可.
- CAD 在ARCGIS中的坐标系问题
近期在使用服务(文本写入dxf方式)导出CAD的时候发现导出的CAD文件和原始数据在ArcMap中叠加后不能重合,出现了错位的现象. 查看CAD文件后发现CAD的坐标系及投影和数据不一致导致的.遇到这 ...
- 【工作分解法】IT人,你的工作“轻松”么?
一.前言 假如读者是一个老板,下面有两位员工,工作难度一样,完成量一样,人品和责任心也一样.一位每天加班加点,废寝忘食的工作:而另外一位每天在座位上喝着咖啡,非常的轻松自如的工作.您会更器重哪一位? ...
- requests库下载图片的方法
方法: 传入图片url,requests.get()方法请求一下,将源码以二进制的形式写在本地即可. 以前一直以为requests库中有特定的方法获取图片,类似urllib.request.urlre ...
- zabbix利用SNMPTrap接收交换机主动告警
zabbix接收trap的工作流程: snmptrapd 收到trap snmptrapd将trap传递给SNMPTT或调用Perl接收器 SNMPTT或Perl trap接收器解析,格式化并将tra ...
- Clion快捷键
快捷键配置 File->Setting->Keymap->Keymaps 选择Visual Studio风格 代码提示的匹配模式 File->Setting->Edito ...
- IdentityServer4实战 - JWT Issuer 详解
一.前言 本文为系列补坑之作,拖了许久决定先把坑填完. 下文演示所用代码采用的 IdentityServer4 版本为 2.3.0,由于时间推移可能以后的版本会有一些改动,请参考查看,文末附上Demo ...
- Django-admin管理工具
知识预览 admin组件使用 admin源码解析 admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目 ...
- Python selenium —— 一定要会用selenium的等待,三种等待方式解读
发现太多人不会用等待了,博主今天实在是忍不住要给大家讲讲等待的必要性. 很多人在群里问,这个下拉框定位不到.那个弹出框定位不到…各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加 ...