LOJ数列分块 9 题解
\(1.\) 题意
给定一个长度 \(n\) 序列,每次查询区间 \(l, r\) 的众数。
\(2.\) 思路
如果边界是 \([l,r]\),\(l\) 在第 \(a\) 块,\(r\) 在第 \(b\) 块,可以分成三个部分:
- \(l\) 到 \(a\) 最后一块
- \([a+1→b−1]\) 块
- 第 \(b\) 块到 \(r\)
根据上面的性质,如果我们预先处理 \([a+1→b−1]\) 块的众数,再去遍历判断第一部分和第三部分是否有更合适的众数,这道题就能做出来了。
#include <map>
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#pragma GCC optimize(3, "Ofast", "inline")
#pragma GCC optimize("no-stack-protector")
#define int long long
using namespace std;
template <class T> inline void read(T &x){
x = 0; register char c = getchar(); register bool f = 0;
while (!isdigit(c)) f ^= c == '-', c = getchar();
while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
if (f) x = -x;
}
template <class T> inline void print(T x){
if (x < 0) putchar('-'), x = -x;
if (x > 9) print(x / 10);
putchar('0' + x % 10);
}
const int N = 2e5 + 10;
const int M = 1e3 + 10;
int n, b, tot, a[N], id[N], val[N], cnt[N], dp[M][M];
vector<int> block[N];
unordered_map<int,int> mp;
inline void init(int pos){
memset(cnt, 0, sizeof cnt);
int maxx = 0, ans = 0;
for(int i = (pos - 1) * b + 1; i <= n; i ++){
cnt[a[i]] ++;
if(cnt[a[i]] > maxx || (cnt[a[i]] == maxx && val[a[i]] < val[ans])) ans = a[i], maxx = cnt[a[i]];
dp[pos][id[i]] = ans;
}
}
inline int getlen(int l, int r, int x){
return upper_bound(block[x].begin(), block[x].end(), r) - lower_bound(block[x].begin(), block[x].end(), l);
}
int query(int l, int r){
register int ans, maxx;
ans = dp[id[l] + 1][id[r] - 1];
maxx = getlen(l, r, ans);
for(register int i = l; i <= min(id[l] * b, r); i++){
int tmp = getlen(l, r, a[i]);
if(tmp > maxx || (tmp == maxx && val[a[i]] < val[ans]))
ans = a[i], maxx = tmp;
}
if(id[l] == id[r]) return ans;
for(register int i = (id[r] - 1) * b + 1; i <= r; i++){
int tmp = getlen(l, r, a[i]);
if(tmp > maxx || (tmp == maxx && val[a[i]] < val[ans]))
ans = a[i], maxx = tmp;
}
return ans;
}
signed main(){
read(n); b = 100;
for(int i = 1; i <= n; i ++){
read(a[i]);
if(mp[a[i]] == 0) mp[a[i]] = ++ tot, val[tot] = a[i];
a[i] = mp[a[i]];
block[a[i]].push_back(i);
}
for(int i = 1; i <= n; i ++) id[i] = (i - 1) / b + 1;
for(int i = 1; i <= id[n]; i ++) init(i);
for(int i = 1, l, r; i <= n; i ++){
read(l), read(r);
print(val[query(l, r)]), puts("");
}
return 0;
}
LOJ数列分块 9 题解的更多相关文章
- [Loj] 数列分块入门 1 - 9
数列分块入门 1 https://loj.ac/problem/6277 区间加 + 单点查询 #include <iostream> #include <cstdio> #i ...
- loj 数列分块入门 6 9(区间众数)
6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vecto ...
- loj 数列分块入门 5 7 8
5 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间开方,区间求和. 思路 用\(tag\)记录这一块是否已全为\(1\). 除分块外,还可用 树状数组+并查集(链表) 或者 线 ...
- LOJ 数列分块入门系列
目录 1.区间加+单点查 每个块维护tag,散的暴力改. code: #include<bits/stdc++.h> using namespace std; const int maxn ...
- LOJ 6277-6280 数列分块入门 1-4
数列分块是莫队分块的前置技能,练习一下 1.loj6277 给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 直接分块+tag即可 #include <bits/stdc++.h ...
- LibreOJ6279. 数列分块入门 3 题解
题目链接:https://loj.ac/problem/6279 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,询问区间内小于某个值 \(x\) 的前驱(比其 ...
- LibreOJ 6277. 数列分块入门 1 题解
题目链接:https://loj.ac/problem/6277 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 \( ...
- LOJ 6277:数列分块入门 1(分块入门)
#6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ...
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
随机推荐
- 微信小程序加密解密参数
加密:encodeURIComponent(参数) 解密:decodeURIComponent(参数)
- 使用Socket实现HttpServer(二)
使用Socket实现HttpServer(二) 前面我们使用 Socket 实现了一个简易的 HttpServer,接下来我们将对我们的服务器进行优化: 面向对象的封装 优化线程模型(引入多线程) R ...
- Linux内核--链表结构(二)
Linux内核链表定义了一系列用于链表遍历的宏,本章详细描述. 一.container_of和offsetof 首先介绍两个很好用的宏container_of和offsetof.offsetof宏用于 ...
- js实时监听dom尺寸变化
开发过程中总会遇到dom节点尺寸变化,去做一些相应的逻辑,第一想到的应该是用$(window).resize()去做,但是这个是监听浏览器窗口的所以这个时候要用 ResizeObserver Resi ...
- 日常使用mobx的小技巧
日常使用mobx的小技巧 由于自己开发的项目都是中小型项目,所以在技术选型上使用了mobx.但是使用过程中发现关于mobx的技术文章并不多.于是萌发出写这篇文章的想法.请轻喷. 更新控制store渲染 ...
- SpringCloud入门简述
1.微服务简述 微服务,是一个小型的服务,也是一种设计理念,将一个大型繁杂的系统拆分为多个小型的服务,进行独立部署,这些服务在独立进程中运行,通过特定的协议进行通信 优点: 轻量化:一个服务不 ...
- Vue_transition动画
1 <!DOCTYPE html> 2 <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml ...
- 使用 shell 脚本自动获取发版指标数据
问题背景 大一点的公司都会建立一套规章流程来避免低级错误,例如合入代码前必需经过同行评审:上线前必需提测且通过 QA 验证:全量前必需经过 1%.5%.10%.20%.50% 的灰度过程.尤其是最后一 ...
- Vagrant详细教程
一.安装virtualBox 进入 VirtualBox 的主页,即可进入下载页面. VirtualBox 是一个跨平台的虚拟化工具,支持多个操作系统,根据自己的情况选择对应的版本下载即可. 在安装完 ...
- Linux获取本机公网IP,调整双节点主从服务的RPC调用逻辑
简单记录一次双节点的之间的服务调用叭 ~ 现有: 服务A的双节点A1.A2 服务B的双节点B1.B2 服务A 和服务B 通过 Netty 实现 RPC 通信,可能会导致比较玄学的问题.如图: 要做到 ...