「Violet」蒲公英

传送门

区间众数,强制在线。

分块经典题。

这题一样预处理,然后就直接爆搞,复杂度 \(O(n \sqrt n)\)

参考代码:

#include <algorithm>
#include <cstdio>
#include <cmath>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} const int _ = 40005, __ = 205; int n, q, len, a[_], X[_], cnt[_], Q[_];
int m, pos[_], f[__][__], c[__][_]; inline int Query(int l, int r) {
int res, num;
if (pos[l] == pos[r]) {
res = num = 0;
for (rg int k = l; k <= r; ++k) {
++cnt[a[k]];
if (num < cnt[a[k]] || (num == cnt[a[k]] && a[k] < res))
num = cnt[a[k]], res = a[k];
}
for (rg int i = l; i <= r; ++i) cnt[a[i]] = 0;
} else {
res = f[pos[l] + 1][pos[r] - 1], num = c[pos[r] - 1][res] - c[pos[l]][res];
Q[0] = 0;
for (rg int i = l; i <= pos[l] * m && i <= n; ++i) Q[++Q[0]] = a[i];
for (rg int i = (pos[r] - 1) * m + 1; i <= r; ++i) Q[++Q[0]] = a[i];
for (rg int i = 1; i <= Q[0]; ++i) {
if (cnt[Q[i]] == 0)
cnt[Q[i]] = c[pos[r] - 1][Q[i]] - c[pos[l]][Q[i]];
++cnt[Q[i]];
if (num < cnt[Q[i]] || (num == cnt[Q[i]] && res > Q[i]))
num = cnt[Q[i]], res = Q[i];
}
for (rg int i = 1; i <= Q[0]; ++i) cnt[Q[i]] = 0;
}
return res;
} int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n), read(q), m = sqrt(1.0 * n);
for (rg int i = 1; i <= n; ++i) read(a[i]), X[i] = a[i], pos[i] = (i - 1) / m + 1;
sort(X + 1, X + n + 1);
len = unique(X + 1, X + n + 1) - X - 1;
for (rg int i = 1; i <= n; ++i) a[i] = lower_bound(X + 1, X + len + 1, a[i]) - X;
for (rg int i = 1; i <= pos[n]; ++i) {
for (rg int j = 1; j <= len; ++j) c[i][j] = c[i - 1][j];
for (rg int j = (i - 1) * m + 1; j <= i * m; ++j) ++c[i][a[j]];
}
int res, num;
for (rg int i = 1; i <= pos[n]; ++i)
for (rg int j = i; j <= pos[n]; ++j) {
res = f[i][j - 1], num = c[j - 1][res] - c[i - 1][res];
for (rg int k = (j - 1) * m + 1; k <= j * m; ++k) {
if (cnt[a[k]] == 0)
cnt[a[k]] = c[j - 1][a[k]] - c[i - 1][a[k]];
++cnt[a[k]];
if (num < cnt[a[k]] || (num == cnt[a[k]] && res > a[k]))
num = cnt[a[k]], res = a[k];
}
f[i][j] = res;
for (rg int k = (j - 1) * m + 1; k <= j * m; ++k) cnt[a[k]] = 0;
}
for (rg int ans = 0, l, r; q--; ) {
read(l), l = (l + ans - 1) % n + 1;
read(r), r = (r + ans - 1) % n + 1;
if (l > r) swap(l, r);
ans = X[Query(l, r)], printf("%d\n", ans);
}
return 0;
}

「Violet」蒲公英的更多相关文章

  1. 「分块系列」「洛谷P4168 [Violet]」蒲公英 解题报告

    蒲公英 Description 我们把所有的蒲公英看成一个长度为\(n\)的序列(\(a_1,a_2,...a_n\)),其中\(a_i\)为一个正整数,表示第i棵蒲公英的种类的编号. 每次询问一个区 ...

  2. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  3. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  4. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  5. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  6. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  7. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  8. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  9. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

随机推荐

  1. The Preliminary Contest for ICPC Asia Xuzhou 2019 J Random Access Iterator (树形DP)

    每次循环向下寻找孩子时,随机选取一个孩子,设dp[u]为从u出发,不能得出正确答案的概率,则从u出发,走一次的情况下不能得出正确答案的概率是 P = (dp[v1]+dp[v2]+dp[v3]+--d ...

  2. sqli-libs(11-22关)

    Less_11 点开11关出现登录页面: 1.可以随便输密码和账号,submit之后出现错误,可以看到查询username和password用and连接放在同一个SQL语句中 打开使用burp sui ...

  3. php substr的一些用法

    //去掉最后一个字符$str = "1,2,3,4,5,6,"; $newstr = substr($str,0,strlen($str)-1); echo $newstr; ub ...

  4. SEO 建站过程复盘

    今天在A5看到一篇关于一个牛站的复盘,整个建站过程值得借鉴. https://www.admin5.com/article/20200218/943930.shtml

  5. php mongdb driver 1.17

    Installation To build and install the driver: $ pecl install mongodb $ echo "extension=mongodb. ...

  6. Linux - 删除文件的正确方式

    mv <file> /tmp/ cp <file> /opt/file.bak rm

  7. Coursera-吴恩达机器学习课程笔记-Week4+5

    Neural networks non-linear hypotheses 非线性假设 Neural model:logistic unit 第一层 Input layer 最后一层 Outer la ...

  8. leetcode 0209

    目录 ✅ 500. 键盘行 描述 解答 ✅ 905. 按奇偶排序数组 描述 解答 py sorted 参数详解 ✅ 559. N叉树的最大深度 描述 解答 java dfs-like method(r ...

  9. Educational Codeforces Round 79 (Rated for Div. 2) - D. Santa's Bot(数论)

    题意:有$n$个孩子,第$i$个孩子有$k[i]$件想要的礼物,第$j$个礼物为$a[i][j]$,现在随机挑一个孩子,从他想要的礼物里面随机挑一个,然后送给另一个孩子$($这个孩子可以和第一个孩子是 ...

  10. ajax发送GET和POST请求

    1.ajax-get请求demo <script> document.getElementById("buttonname").onclik=function(){ / ...