「Violet」蒲公英
「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」蒲公英的更多相关文章
- 「分块系列」「洛谷P4168 [Violet]」蒲公英 解题报告
蒲公英 Description 我们把所有的蒲公英看成一个长度为\(n\)的序列(\(a_1,a_2,...a_n\)),其中\(a_i\)为一个正整数,表示第i棵蒲公英的种类的编号. 每次询问一个区 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- Yii2.0 连接数据库
打开数据库配置文件common\config\main-local.php
- IDEA 导出可执行jar包【转载】
1,在项目上鼠标右键 --> Open Module Settings,或者[shift+ctrl+alt+s] 2, Artifacts --> + --> JAR --> ...
- VBA 学习笔记 - 日期
date() 返回当前的系统日期 返回格式为 YYYY/MM/DD CDate() 学习资料:https://www.yiibai.com/vba/vba_cdate_function.html 将有 ...
- Django模板及路由的配置
学习内容: (1)路由的配置 (2)模板的介绍 (3)模板显示数据 一.路由的配置 以上一篇文章的名字Booketest项目,有一个子模块demo1进行讲解. 1.首先在Booktest项目下的同名子 ...
- Java 11 New Features
前言 北京时间 2018年9 月 26 日,Oracle 官方宣布 Java 11 正式发布.这是 Java 大版本周期变化后的第一个长期支持版本,非常值得关注.从官网即可下载, 最新发布的 Java ...
- ESLint规则整理与实际应用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lhb_11/article/detail ...
- formValidation单个输入框值改变时校验
$("#tv_form").data("formValidation").updateStatus("pay.vcAmount", &qu ...
- C++ STL之集合set的使⽤
写在最前面,本文摘录于柳生笔记: set是集合,一个set里面个元素各不相同的,而且set会按照元素从小到大的进行排序,一下是set的常用方法:
- 华水开学第一课&微信支付
由于疫情的延续,导致我们不能及时开学.只能在网上观看华水开学第一课,但是好像正常开学也没有这个哈哈(不记得了) 昨天没有玩到很晚,12点就睡下.大约半个小时睡着了.定了8点的闹钟.起来的时候那是真的困 ...
- DB开启 Service Broker,使用消息队列
ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;; ALTER DATABASE [DBNAME] SET TRUS ...