BZOJ2724 [Violet]蒲公英(分块)
区间众数。分块,预处理任意两块间所有数的众数,和每块中所有数的出现次数的前缀和。查询时对不是整块的部分暴力,显然只有这里出现的数可能更新答案。于是可以优美地做到O(n√n)。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 50010
#define BLOCK 250
int n,m,a[N],b[N],lastans=;
int block,tot,L[N],R[N],pos[N];
int cnt[N],f[BLOCK][BLOCK],sum[BLOCK][N];
int main()
{
freopen("bzoj2724.in","r",stdin);
freopen("bzoj2724.out","w",stdout);
n=read(),m=read();
for (int i=;i<=n;i++) b[i]=a[i]=read();
sort(b+,b+n+);
int t=unique(b+,b+n+)-b;
for (int i=;i<=n;i++) a[i]=lower_bound(b+,b+t,a[i])-b;
block=sqrt(n);tot=n/block+(n%block>);
for (int i=;i<=n/block;i++)
L[i]=(i-)*block+,R[i]=(i-)*block+block;
if (n/block<tot) L[tot]=n/block*block+,R[tot]=n;
for (int i=;i<=tot;i++)
{
memset(cnt,,sizeof(cnt));
int num=;
for (int j=i;j<=tot;j++)
{
for (int k=L[j];k<=R[j];k++)
{
cnt[a[k]]++;
if (cnt[a[k]]>cnt[num]||cnt[a[k]]==cnt[num]&&a[k]<num) num=a[k];
}
f[i][j]=num;
}
memcpy(sum[i],sum[i-],sizeof(sum[i]));
for (int j=L[i];j<=R[i];j++)
pos[j]=i,sum[i][a[j]]++;
}
memset(cnt,,sizeof(cnt));
while (m--)
{
int x=read(),y=read();
x=(x+lastans-)%n+,y=(y+lastans-)%n+;
if (x>y) swap(x,y);
int num=;
if (pos[x]==pos[y])
{
for (int i=x;i<=y;i++)
{
cnt[a[i]]++;
if (cnt[a[i]]>cnt[num]||cnt[a[i]]==cnt[num]&&a[i]<num) num=a[i];
}
for (int i=x;i<=y;i++) cnt[a[i]]--;
}
else
{
num=f[pos[x]+][pos[y]-];
for (int i=x;i<=R[pos[x]];i++)
{
cnt[a[i]]++;
if (cnt[a[i]]+sum[pos[y]-][a[i]]-sum[pos[x]][a[i]]>cnt[num]+sum[pos[y]-][num]-sum[pos[x]][num]
||cnt[a[i]]+sum[pos[y]-][a[i]]-sum[pos[x]][a[i]]==cnt[num]+sum[pos[y]-][num]-sum[pos[x]][num]&&a[i]<num)
num=a[i];
}
for (int i=L[pos[y]];i<=y;i++)
{
cnt[a[i]]++;
if (cnt[a[i]]+sum[pos[y]-][a[i]]-sum[pos[x]][a[i]]>cnt[num]+sum[pos[y]-][num]-sum[pos[x]][num]
||cnt[a[i]]+sum[pos[y]-][a[i]]-sum[pos[x]][a[i]]==cnt[num]+sum[pos[y]-][num]-sum[pos[x]][num]&&a[i]<num)
num=a[i];
}
for (int i=x;i<=R[pos[x]];i++) cnt[a[i]]--;
for (int i=L[pos[y]];i<=y;i++) cnt[a[i]]--;
}
lastans=b[num];
printf("%d\n",b[num]);
}
fclose(stdin);fclose(stdout);
return ;
}
BZOJ2724 [Violet]蒲公英(分块)的更多相关文章
- BZOJ2724 [Violet]蒲公英 分块
题目描述 经典区间众数题目 然而是权限题,所以题目链接放Luogu的 题解 因为太菜所以只会$O(n*\sqrt{n}+n*\sqrt{n}*log(n))$的做法 就是那种要用二分的,并不会clj那 ...
- [Violet]蒲公英 分块
发现写算法专题老是写不动,,,, 所以就先把我在luogu上的题解搬过来吧! 题目大意:查询区间众数,无修改,强制在线 乍一看是一道恐怖的题,仔细一看发现并没有那么难: 大致思路是这样的,首先我们要充 ...
- Luogu P4168 [Violet]蒲公英 分块
这道题算是好好写了.写了三种方法. 有一个好像是$qwq$$N\sqrt(N)$的方法,,但是恳请大佬们帮我看看为什么这么慢$qwq$(后面的第三种) 注:$pos[i]$表示$i$属于第$pos[i ...
- [BZOJ2724][Violet 6]蒲公英
[BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...
- 【BZOJ2724】蒲公英(分块)
[BZOJ2724]蒲公英(分块) 题面 洛谷 谴责权限题的行为 题解 分块什么的都不会,根本就没写过几次. 复杂度根本不会分析,吓得我赶快来练练. 这题要求的是区间众数,显然没有什么很好的主席树之类 ...
- 洛谷 P4168 [Violet]蒲公英 解题报告
P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...
- 【BZOJ2724】[Violet 6]蒲公英 分块+二分
[BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...
- BZOJ2724 [Violet 6]蒲公英 分块
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...
- 【分块】bzoj2724 [Violet 6]蒲公英
分块,离散化,预处理出: ①前i块中x出现的次数(差分): ②第i块到第j块中的众数是谁,出现了多少次. 询问的时候,对于整块的部分直接获得答案:对于零散的部分,暴力统计每个数出现的次数,加上差分的结 ...
随机推荐
- 利用 ProtoThreads实现Arduino多线程处理(1)
转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 这几天和群里小V同学讨论一个项目时,偶然发现了 ProtoThreads,简称PT,用其来实 ...
- CMM:软件成熟度模型
周末在家闲来无事,泡咖啡看书,正好看到了关于CMM的相关资料,分享出来,也当做学习笔记... 一.CMM简介 CMM,英文全称为Capability Maturity Model for Softwa ...
- struts2中ajax的使用
前面写过原生js实现ajax的博客,但是用起来不是太方便,jquery对原生的js进行了很好的封装,使用起来也更简单:但是在项目中使用了struts2,处理ajax却又不同,花了几天时间研究,终于解决 ...
- 人生苦短之HTTP协议及Requests库的方法
requests库的主要方法:requests.request()构造一个请求 requests.get()获取HTML网页的主要方法,对应于HTTP的GET requests.head( ...
- LED恒流驱动IC汇总
LED恒流驱动IC汇总 2017年09月22日 11:29:01 阅读数:569 这几天在找LED恒流驱动芯片,无意间在LED网论坛上发现这个帖子,分享给大家! LED恒流IC芯片大盘点 ...
- PMS-授权中心
概述 授权中心用基于角色的访问控制思想(RBAC-Role Based Access Control)来实现各个业务系统的功能权限及数据权限控制.功能权限是指能否进入页面及使用页面上的操作.数据权限控 ...
- Codeforces Edu Round 63(Rated for Div. 2)
感觉现在Edu场比以前的难多了…… A: 温暖人心 /* basic header */ #include <iostream> #include <cstdio> #incl ...
- Luogu P1447 [NOI2010]能量采集
Preface 最近反演题做多了看什么都想反演.这道题由于数据弱,解法多种多样,这里简单分析一下. 首先转化下题目就是对于一个点\((x,y)\),所消耗的能量就是\(2(\gcd(x,y)-1)+1 ...
- Object-Oriented(一)创建对象
自用备忘笔记 前言 虽然可以使用 Object 和对象字面量创建对象,但是如果要创建大量相似的对象又显得麻烦.为解决这个问题,人们开始使用工厂模式的变种. 工厂模式 function person(n ...
- sigar开发(java)
下载sigar,地址:https://yunpan.cn/cBEWbEfdAm98f (提取码:f765) 可以收集的信息 CPU信息:包括基本信息(vendor.model.mhz.cacheSiz ...