题目大意:有$n(n\leqslant4\times10^4)$个数,$m(m\leqslant5\times10^4)$个询问,每次问区间$[l,r]$内的众数,若相同输出最小的,强制在线。

题解:先离散化,分块,设块大小为$S$,可以在$O(\dfrac n S n)$的复杂度内预处理出每两个块间的众数。考虑询问,发现询问中的众数要么是整块的那一个众数,要么就是非整块内出现过的数,可以用主席树查询区间数出现个数,比较一下即可,一次查询复杂度$O(2S\log_2 n)$。$S$开的比$\sqrt n$小一点就行了

卡点:主席树查询时左端点没有减一,数组开小

C++ Code:

#include <algorithm>
#include <cctype>
#include <cstdio>
#include <cstring>
namespace __IO {
namespace R {
int x, ch;
inline int read() {
while (isspace(ch = getchar()));
for (x = ch & 15; isdigit(ch = getchar());) x = x * 10 + (ch & 15);
return x;
}
}
}
using __IO::R::read; #define maxn 40010
const int BSZ = 100, Bnum = maxn / BSZ + 5; namespace SgT {
#define N (maxn * 20)
int lc[N], rc[N], V[N], idx; void insert(int &rt, const int l, const int r, const int num) {
lc[++idx] = lc[rt], rc[idx] = rc[rt], V[idx] = V[rt] + 1, rt = idx;
if (l == r) return ;
const int mid = l + r >> 1;
if (num <= mid) insert(lc[rt], l, mid, num);
else insert(rc[rt], mid + 1, r, num);
}
int query(const int L, const int R, const int l, const int r, const int num) {
if (l == r) return V[R] - V[L];
const int mid = l + r >> 1;
if (num <= mid) return query(lc[L], lc[R], l, mid, num);
else return query(rc[L], rc[R], mid + 1, r, num);
} #undef N
} int n, m, ans, anscnt;
int rt[maxn];
int v[maxn], s[maxn], bl[maxn];
int L[Bnum], R[Bnum], cnt[maxn];
int Max[Bnum][Bnum]; int main() {
n = read(), m = read();
for (int i = 1; i <= n; i++) {
v[i] = s[i] = read(); bl[i] = i / BSZ + 1;
}
int tot = (std::sort(v + 1, v + n + 1), std::unique(v + 1, v + n + 1) - v - 1);
for (int i = 1; i <= n; i++) {
SgT::insert(rt[i] = rt[i - 1], 1, tot, s[i] = std::lower_bound(v + 1, v + tot + 1, s[i]) - v);
} const int B = bl[n];
for (int i = 1; i <= B; i++) L[i] = (i - 1) * BSZ, R[i] = L[i] + BSZ - 1;
L[1] = 1, R[B] = n;
for (int l = 1, r, M; l <= B; l++) {
r = l, M = 0;
memset(cnt, 0, sizeof cnt);
for (int i = L[l]; i <= n; i++) {
cnt[s[i]]++;
if (cnt[s[i]] > cnt[M] || (cnt[s[i]] == cnt[M] && s[i] < M)) M = s[i];
if (i == R[r]) Max[l][r] = M, r++;
}
} while (m --> 0) {
int l = (read() + ans - 1) % n + 1, r = (read() + ans - 1) % n + 1;
if (l > r) std::swap(l, r);
const int lb = bl[l], rb = bl[r];
ans = anscnt = 0;
#define check(x) {\
const int tmp = SgT::query(rt[l - 1], rt[r], 1, tot, x); \
if (tmp > anscnt || (tmp == anscnt && x < ans)) ans = x, anscnt = tmp;\
}
if (lb == rb) {
for (register int i = l; i <= r; i++) check(s[i]);
} else {
for (register int i = l; i <= R[lb]; i++) check(s[i]);
if (lb + 1 <= rb - 1) check(Max[lb + 1][rb - 1]);
for (register int i = L[rb]; i <= r; i++) check(s[i]);
}
#undef check
printf("%d\n", ans = v[ans]);
}
return 0;
}

  

[洛谷P4168][Violet]蒲公英的更多相关文章

  1. 洛谷 P4168 [Violet]蒲公英 解题报告

    P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...

  2. 洛谷 P4168 [Violet] 蒲公英

    历尽千辛万苦终于AC了这道题目... 我们考虑1个区间\([l,r]\), 被其完整包含的块的区间为\([L,R]\) 那么众数的来源? 1.\([l,L)\)或\((R,r]\)中出现的数字 2.\ ...

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

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

  4. 洛谷P1445 [Violet] 樱花 (数学)

    洛谷P1445 [Violet] 樱花 题目背景 我很愤怒 题目描述 求方程 1/X+1/Y=1/(N!) 的正整数解的组数,其中N≤10^6. 解的组数,应模1e9+7. 输入输出格式 输入格式: ...

  5. 洛谷P4168 蒲公英 分块处理区间众数模板

    题面. 许久以前我还不怎么去机房的时候,一位大佬好像一直在做这道题,他称这道题目为"大分块". 其实这道题目的思想不只可以用于处理区间众数,还可以处理很多区间数值相关问题. 让我们 ...

  6. BZOJ2721或洛谷1445 [Violet]樱花

    BZOJ原题链接 洛谷原题链接 其实推导很简单,只不过我太菜了想不到...又双叒叕去看题解 简单写下推导过程. 原方程:\[\dfrac{1}{x} + \dfrac{1}{y} = \dfrac{1 ...

  7. 【题解】洛谷P1445 [Violet]樱花 (推导+约数和)

    洛谷P1445:https://www.luogu.org/problemnew/show/P1445 推导过程 1/x+1/y=1/n! 设y=n!+k(k∈N∗) 1/x​+1/(n!+k)​=1 ...

  8. 洛谷P4168 蒲公英 [Violet] 分块

    题解:分块+离散化 解题报告: 一个分块典型题呢qwq还是挺妙的毕竟是道黑题 然,然后发现忘记放链接了先放链接QAQ 有两三种解法,都港下qwq 第一个是O(n5/3)的复杂度,谢总说不够优秀没有港, ...

  9. 【洛谷 P4168】[Violet]蒲公英(分块)

    题目链接 题目大意:给定\(n\)个数和\(m\)个求区间众数的询问,强制在线 这题我\(debug\)了整整一个下午啊..-_- 从14:30~16:45终于\(debug\)出来了,\(debug ...

随机推荐

  1. 机器学习实战:决策树的存储读写文件报错(Python3)

    错误原因:pickle模块存储的是二进制字节码,需要以二进制的方式进行读写 1. 报错一:TypeError: write() argument must be str, not bytes 将决策树 ...

  2. 鸡啄米:C++编程之十三学习之类与对象,类的声明,成员的访问控制

    1. 本次学习鸡啄米课程第13篇,把比较重要的学习记录下来,以敦促自己更好的学习.推荐他们的网址学习:http://www.jizhuomi.com/school/c/97.html 2. 在面向过程 ...

  3. Android7.0 应用内升级

    Android7.0应用内升级 最近线上项目在7.0机器上出现应用内升级失败,原来是由于Android7.0权限问题导致. 如果项目的 targetSdkVersion>=24 在处理应用内升级 ...

  4. webpack loader 生成虚拟文件的方案

    此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 使用 webpack 的时候,难免需要写一些 loader,接着就会遇到一个很纠结的问题.该 loade ...

  5. 从细节处谈Android冷启动优化

    本文来自网易云社区 Android APP冷启动优化,对于Android开发同学而言可能是个老生常谈的技优了. 之所以花时间写一篇冷启动优化的文章: 我想从另外一个角度来说冷启动优化,如题所述,从细节 ...

  6. OSG-CompositeViewer

    原文连接地址:http://www.osgchina.org/index.php?Itemid=490&id=134:usecompositiv&option=com_content& ...

  7. Java开发工程师(Web方向) - 03.数据库开发 - 第1章.JDBC

    第1章--JDBC JDBC基础 通过Java Database Connectivity可以实现Java程序对后端数据库的访问 一个完整的数据库部署架构,通常是由客户端和服务器端两部分组成 客户端封 ...

  8. 【转】Bootstrap FileInput中文API整理

    Bootstrap FileInput中文API整理 这段时间做项目用到bootstrap fileinput插件上传文件,在用的过程中,网上能查到的api都不是很全,所以想着整理一份比较详细的文档, ...

  9. 深入理解java虚拟机学习笔记(一)

    第二章 Java内存区域与内存溢出异常 运行时数据区域 程序计数器(Program Counter Register) 程序计数器:当前线程所执行的字节码行号指示器.各条线程之间计数器互不影响,独立存 ...

  10. 单词 (Play on Words UVA - 10129 )

    题目描述: 原题:https://vjudge.net/problem/UVA-10129 题目思路: 1.明显是判断欧拉路径 2.欧拉路径的两个条件 a.图连通 b.至多为两个奇点,且一个为起点一个 ...