Violet蒲公英
题目要求求出给定区间内编号最小的众数,强制在线。
虽然说这是个黑题……不过我们可以用暴力分块解决它。首先先对所有数离散化,这个不影响众数。我们先预处理出每个数在前i个块内出现了多少次,再预处理出块i到块j内最小众数是谁。前者很好预处理,后者的话,我们只要固定i,之后向后枚举,每次新加入一个数的时候就比较出现最多次的元素来更新当前众数。如果到了块末尾,就更新块的答案。
查询的时候,整块的我们直接去计算过的答案,之后对于每一个出现在零散位置的元素,我们记录下来,之后计算他们在整块中出现了多少次(前缀和相减即可),这样比较出出现次数最多的元素就可以。
这题的处理稍微有点复杂,我的做法是开个栈来记录当前出现在零散位置的元素。
看一下代码。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ;
const int N = ;
const int INF = ; int read()
{
int ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} int n,m,B,a[M],l[N],r[N],sum[M][N],ans[N][N],x,y,last,b[M],cnt,blo[M],tot,g = ,cur[M],maxx;
int sta[M],top,mpos; void init()
{
rep(i,,cnt)
{
rep(j,,n) sum[j][i] += sum[j][i-];
rep(j,l[i],r[i]) sum[a[j]][i]++;
}
rep(i,,cnt)
{
memset(cur,,sizeof(cur)),maxx = mpos = ,g = i;
rep(j,l[i],n)
{
cur[a[j]]++;
if(cur[a[j]] > maxx) maxx = cur[a[j]],mpos = a[j];
else if(cur[a[j]] == maxx && a[j] < mpos) mpos = a[j];
if(j == r[g]) ans[i][g] = mpos,g++;
}
}
} int query(int x,int y)
{
memset(cur,,sizeof(cur)),maxx = mpos = ;
int L = blo[x],R = blo[y];
if(L == R)
{
rep(i,x,y)
{
cur[a[i]]++;
if(cur[a[i]] > maxx) maxx = cur[a[i]],mpos = a[i];
else if(cur[a[i]] == maxx && a[i] < mpos) mpos = a[i];
}
return mpos;
}
int p = ans[L+][R-],now = sum[p][R-] - sum[p][L];
rep(i,x,r[L])
{
if(!cur[a[i]]) sta[++top] = a[i];
cur[a[i]]++;
}
rep(i,l[R],y)
{
if(!cur[a[i]]) sta[++top] = a[i];
cur[a[i]]++;
}
mpos = p;
while(top)
{
int k = sta[top],q = sum[k][R-] - sum[k][L] + cur[k];
if(q > now) now = q,mpos = k;
else if(q == now && k < mpos) mpos = k;
top--;
}
return mpos;
} int main()
{
n = read(),m = read(),B = sqrt(n);
cnt = (n % B) ? n / B + : n / B;
rep(i,,cnt) l[i] = r[i-] + ,r[i] = l[i] + B - ;
r[cnt] = n;
rep(i,,n) a[i] = b[i] = read();
sort(b+,b++n),tot = unique(b+,b++n) - b - ;
rep(i,,n) a[i] = lower_bound(b+,b++tot,a[i]) - b;
//rep(i,1,n) printf("%d ",a[i]);enter;
rep(i,,n)
{
blo[i] = g;
if(i == r[g]) g++;
}
init();
rep(i,,m)
{
x = read(),y = read();
x = (x + last - ) % n + ,y = (y + last - ) % n + ;
if(x > y) swap(x,y);
last = b[query(x,y)];
printf("%d\n",last);
}
return ;
}
Violet蒲公英的更多相关文章
- 洛谷 P4168 [Violet]蒲公英 解题报告
P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...
- 【luogu1468】[Violet]蒲公英--求区间众数
题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕 ...
- [Violet]蒲公英 分块
发现写算法专题老是写不动,,,, 所以就先把我在luogu上的题解搬过来吧! 题目大意:查询区间众数,无修改,强制在线 乍一看是一道恐怖的题,仔细一看发现并没有那么难: 大致思路是这样的,首先我们要充 ...
- P4168 [Violet]蒲公英 区间众数
$ \color{#0066ff}{ 题目描述 }$ 在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关. 为了简化起见,我们把所有的蒲公英看成一个长度为n的序列 \((a_1,a_2.. ...
- 洛谷 P4168 [Violet] 蒲公英
历尽千辛万苦终于AC了这道题目... 我们考虑1个区间\([l,r]\), 被其完整包含的块的区间为\([L,R]\) 那么众数的来源? 1.\([l,L)\)或\((R,r]\)中出现的数字 2.\ ...
- P4168 [Violet]蒲公英
神仙分块题?其实还是很简单的,res[i][j]表示第i块到第j块的众数,然后再用sum[i][j]表示前i块中j这个种类出现的次数,然后分块瞎搞就行了,感觉我写的十分简洁,好评( //author ...
- BZOJ2724 [Violet]蒲公英(分块)
区间众数.分块,预处理任意两块间所有数的众数,和每块中所有数的出现次数的前缀和.查询时对不是整块的部分暴力,显然只有这里出现的数可能更新答案.于是可以优美地做到O(n√n). #include< ...
- p4168 [Violet]蒲公英(分块)
区间众数的重题 和数列分块入门9双倍经验还是挺好的 然后开O2水过 好像有不带log的写法啊 之后在补就是咕咕咕 // luogu-judger-enable-o2 #include <cstd ...
- BZOJ2724 [Violet]蒲公英 分块
题目描述 经典区间众数题目 然而是权限题,所以题目链接放Luogu的 题解 因为太菜所以只会$O(n*\sqrt{n}+n*\sqrt{n}*log(n))$的做法 就是那种要用二分的,并不会clj那 ...
- [Violet]蒲公英
description 在线询问区间众数. data range \[n\le 40000,m\le 50000,a_i\le 10^9\] solution 自己分块不行于是\(\%\)了\(yyb ...
随机推荐
- [codeforces538E]Demiurges Play Again
[codeforces538E]Demiurges Play Again 试题描述 Demiurges Shambambukli and Mazukta love to watch the games ...
- [POJ1797] Heavy Transportation(最大生成树 || 最短路变形)
传送门 1.最大生成树 可以求出最大生成树,其中权值最小的边即为答案. 2.最短路 只需改变spfa里面的松弛操作就可以求出答案. ——代码 #include <queue> #inclu ...
- 显示倒计时,为零时自动点击按钮提交【JavaScript实现】
原文发布时间为:2008-10-17 -- 来源于本人的百度文章 [由搬家工具导入] <html> <head> <title>显示倒计时,完毕提交</tit ...
- msp430项目编程00
msp430中项目---LED数码管显示 1.数码管介绍 2.代码(直接使用引脚驱动) 3.代码(使用译码器驱动) 4.项目总结 msp430项目编程 msp430入门学习
- iOS React Native 环境的搭建
react native 的官网:http://reactnative.cn/docs/0.47/getting-started.html#content --iOS如何搭建mac版的环境 1.配置 ...
- Bootstrap3 为何无法显示Glyphicons 图标
Bootstrap3 为何无法显示Glyphicons 图标 在CSS引入字体即可解决 @font-face { font-family: 'Glyphicons Halflings'; src: u ...
- 原生js操作dom的方法
今天学习了原生js的dom节点的操作,就记录下来,仅供自己以后参考. 1)创建节点:除了可以使用createElement创建元素,也可以使用createTextNode创建文本节点. documen ...
- Linux 特殊文档说明
目录 /usr/share/man 目录 /usr/share/doc /etc/passwd 文件 /etc/shadow 文件 /etc/group 文件 /usr/share/man 目录 当我 ...
- DotProject首页、文档和下载 - 项目管理工具 - 开源中国社区
DotProject首页.文档和下载 - 项目管理工具 - 开源中国社区
- 进程(WINAPI),遍历并查找树状的进程信息,实现控制系统进程
#include <TlHelp32.h> //检索系统全部进程 void showall() { PROCESSENTRY32 pe32 = {0}; pe32.dwSize = siz ...