*题目描述:

*输入:

修正一下
l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1
*输出:

*样例输入:
6 3
1 2 3 2 1 2
1 5
3 6
1 5
*样例输出:
1
2
1
*提示:

修正下:
n <= 40000, m <= 50000
*题解:
强制在线求区间众数。我们考虑将序列分块,对于每一个块,我们先维护0~当前块的每个数字的出现次数(这样的话我们就可以以O(1)的时间得到两个块之间某个数字的出现个数,类似于前缀和),这样做的空间和时间复杂度都是(sqrt(n) * n),然后我们再暴力预处理出块与块之间的答案,时间复杂度O(n * sqrt(n)),空间复杂度O(sqrt(n) * sqrt(n)) = O(n)。然后每个询问就和其他的分块题一样做就好了。
*代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif #ifdef CT
#define debug(...) printf(__VA_ARGS__)
#define setfile()
#else
#define debug(...)
#define filename ""
#define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
#endif #define R register
#define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
#define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
char B[1 << 15], *S = B, *T = B;
inline int FastIn()
{
R char ch; R int cnt = 0; R bool minus = 0;
while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
ch == '-' ? minus = 1 : cnt = ch - '0';
while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
return minus ? -cnt : cnt;
}
#define maxn 40010
int n, m, block, num, ans, anscnt;
int hash[maxn], a[maxn], id[maxn], cnt[maxn], Ans[210][210], Cnt[210][maxn];
int main()
{
// setfile();
n = FastIn(), m = FastIn();
block = sqrt(n); num = n / block;
R int tot = n;
for (R int i = 1; i <= n; ++i) a[i] = hash[i] = FastIn(), id[i] = i / block;
std::sort(hash + 1, hash + tot + 1);
tot = std::unique(hash + 1, hash + tot + 1) - hash - 1;
for (R int i = 1; i <= n; ++i)
a[i] = std::lower_bound(hash + 1, hash + tot + 1, a[i]) - hash;
// lisanhua
for (R int i = 0; i <= num; ++i)
for (R int j = 1; j < dmin((i + 1) * block, n + 1); ++j)
++Cnt[i][a[j]];
for (R int i = 0; i < num; ++i)
{
anscnt = 0;
for (R int j = i; j <= num; ++j)
{
for (R int k = j * block; k < dmin((j + 1) * block, n + 1); ++k)
++cnt[a[k]] > anscnt || (cnt[a[k]] == anscnt && a[k] < ans)
? anscnt = cnt[a[k]], ans = a[k]
: 0;
Ans[i][j] = ans;
}
memset(cnt, 0, sizeof(cnt));
}
ans = 0;
for (; m; --m)
{
R int ql = (FastIn() + ans - 1) % n + 1, qr = (FastIn() + ans - 1) % n + 1;
anscnt = 0;
if (ql > qr) std::swap(ql, qr);
if (id[ql] == id[qr])
{
for (R int i = ql; i <= qr; ++i)
++cnt[a[i]] > anscnt || (cnt[a[i]] == anscnt && a[i] < ans)
? anscnt = cnt[a[i]], ans = a[i]
: 0;
for (R int i = ql; i <= qr; ++i) --cnt[a[i]];
}
else
{
R int ls = id[ql] + 1, rs = id[qr] - 1;
ans = Ans[ls][rs]; anscnt = Cnt[rs][ans] - Cnt[ls - 1][ans];
for (R int i = ql; i < ls * block; ++i)
{
R int tmp = ++cnt[a[i]] + Cnt[rs][a[i]] - Cnt[ls - 1][a[i]];
tmp > anscnt || (tmp == anscnt && a[i] < ans)
? anscnt = tmp, ans = a[i]
: 0;
}
for (R int i = (rs + 1) * block; i <= qr; ++i)
{
R int tmp = ++cnt[a[i]] + Cnt[rs][a[i]] - Cnt[ls - 1][a[i]];
tmp > anscnt || (tmp == anscnt && a[i] < ans)
? anscnt = tmp, ans = a[i]
: 0;
}
for (R int i = ql; i < ls * block; ++i) --cnt[a[i]];
for (R int i = (rs + 1) * block; i <= qr; ++i) --cnt[a[i]];
}
printf("%d\n", ans = hash[ans]);
}
return 0;
}

【bzoj2724】[Violet 6]蒲公英的更多相关文章

  1. [BZOJ2724][Violet 6]蒲公英

    [BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...

  2. BZOJ2724 [Violet 6]蒲公英 分块

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...

  3. bzoj2724: [Violet 6]蒲公英(离散化+分块)

    我好弱啊..这题调了2天QwQ 题目大意:给定一个长度为n(n<=40000)的序列,m(m<=50000)次询问l~r之间出现次数最多的数.(区间众数) 这题如果用主席树就可以不用处理一 ...

  4. bzoj2724: [Violet 6]蒲公英 分块 区间众数 论algorithm与vector的正确打开方式

    这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众 ...

  5. 【分块】bzoj2724 [Violet 6]蒲公英

    分块,离散化,预处理出: ①前i块中x出现的次数(差分): ②第i块到第j块中的众数是谁,出现了多少次. 询问的时候,对于整块的部分直接获得答案:对于零散的部分,暴力统计每个数出现的次数,加上差分的结 ...

  6. bzoj2724: [Violet 6]蒲公英(分块)

    传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...

  7. 【BZOJ2724】[Violet 6]蒲公英 分块+二分

    [BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...

  8. BZOJ 2724: [Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1633  Solved: 563[Submit][Status ...

  9. BZOJ 2724: [Violet 6]蒲公英( 分块 )

    虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...

  10. BZOJ_2724_[Violet 6]蒲公英_分块

    BZOJ_2724_[Violet 6]蒲公英_分块 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod ...

随机推荐

  1. springBoot(1) 环境安装

    真鸡儿要命.今天做开发.实在是整不动了...所以决定回家,干一波... 发现MyEclipse2014好像真的不用能用了... 瞬间焦头烂额,本来,就跑不了.现在环境也没一个能用的. 于是 就有了今天 ...

  2. 1.parrot os 3.5-----nmap-----katoolin--zenmap

    源:https://www.youtube.com/watch?v=LpM1KooILRc&list=PLBf0hzazHTGOEuhPQSnq-Ej8jRyXxfYvl&index= ...

  3. 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】

    [Linux开发]OpenCV在ARM-linux上的移植过程遇到的问题4-共享库中嵌套库带路径[已解决] 标签:[Linux开发] 紧接着上一篇,我居然又尝试了一下编译opencv,主要是因为由于交 ...

  4. Nginx日志监控 使用 goaccess查看nginx日志

    nginx日志监控 yum install goaccess   安装使用教程 goaccess access.log -o ../html/report.html --real-time-html ...

  5. 银河麒麟v4.0.2 安装gscloud的简单过程

    1. 本来想用 tar包安装 redis 结果总是报错, 提示需要make test 但是我已经make test 了 所以还是使用 apt-get来安装. 2. 方式 apt-get update ...

  6. MySQL-快速入门(12)备份、还原

    1.数据备份 1>使用MySQLdump命令备份(主要的方式) //备份数据库中某张表(去掉表的限定,就是备份指定数据库)//备份脚本可以重新创建表及插入数据mysqldump -u user ...

  7. 部署CM集群首次运行报错:Formatting the name directories of the current NameNode.

    1. 报错提示 Formatting the name directories of the current NameNode. If the name directories are not emp ...

  8. 字符串中的replace方法

    String.prototype.replace() 该方法作为字符串中非常常用的方法, 今天我们具体介绍一下它的用法 语法格式 someString.replace(regxp | substr, ...

  9. nrm安装与配置

    nrm安装与配置:https://blog.csdn.net/anway12138/article/details/79455224

  10. Larkin’s NOI

    Larkin’s NOI Problem Description Larkin has been to Yantai to take part in NOI 2010!众所周知(do you know ...