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 题目描述 给 ...
随机推荐
- vue中触发键盘事件的两种方法和如何自定义键位事件,完整代码!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- flex布局图片和文字同级,文字过多导致图片变形问题
图片增加css样式即可 flex-grow: 0;flex-shrink: 0;
- 测试开发【Mock平台】04实战:前后端项目初始化与登录鉴权实现
[Mock平台]为系列测试开发教程,从0到1编码带你一步步使用Spring Boot 和 Antd React 框架完成搭建一个测试工具平台,希望作为一个实战项目能为你的测试开发学习有帮助. 一.后端 ...
- JavaWeb入门day9-随笔(session/cookie)
会话 一个网站怎么证明用户访问过 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以:cookie 服务器登记,下次访问匹配:session 保存会话的技术 cookie 客户端技术(响应.请 ...
- flex布局 (转)
网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...
- 巧用 JuiceFS Sync 命令跨云迁移和同步数据
近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移到另一个云平台,业务 ...
- B08. BootstrapBlazor实战 Menu 导航菜单使用(2)
接上篇: B08. BootstrapBlazor实战 Menu 导航菜单使用(1) 3.项目模板 节省时间,直接使用 Bootstrap Blazor App 模板快速搭建项目 传送门: https ...
- 2.3 为什么建议使用虚拟机来安装Linux?
笔者认为,通过虚拟机软件学习是初学者学习 Linux 的最佳方式. 在与部分读者的交流中,笔者发现,很多初学者都认为,学习 Linux 就必须将自己的电脑装成 Linux 系统或者必须要有真正的服务器 ...
- 北航内核操作系统-lab0
1.lab0环境介绍. 2.进入实验界面. 3.进入实战测试. 任务要求: 3.1编写斐波那契数列. 3.2编写Makefile脚本. Makefile介绍: make命令执行时,需要一个 Makef ...
- 第一个MVC程序
配置版 添加web的支持! 确定导入了SpringMVC 的依赖! 配置web.xml , 注册DispatcherServlet <?xml version="1.0" e ...