LOJ#6285. 数列分块入门 9
有点难.....
要求区间众数,所以我可以先把区间分块,然后我预处理出从第 i 块到第 j 块的众数,用dp[i][j]记录下来。
因为需要知道众数的num值, 所以我可以用一个vector来保存每个数的所有的出现位置,然后我待会我查询的时候就查询我所需要的[l, r]中有多少个这个数。
所以要求区间众数的时候,我可以通过之前打表的dp找出这中间完整的块的众数,然后对于边上的不完整的块,直接暴力扫过去,然后找最大的就可以了
#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define first fi
#define second se
#define lowbit(x) (x & (-x)) typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = ;
const int maxm = ;
const int mod = ;
using namespace std; int n, m, tol, T;
int block;
int a[maxn];
int b[maxn];
int cnt[maxn];
int belong[maxn];
int dp[maxm][maxm];
vector<int> v[maxn]; void init() { } int L(int x) {
return (x-) * block + ;
} int R(int x) {
return min(n, x*block);
} void handle(int x) {
int ans = ;
int num = ;
memset(cnt, , sizeof cnt);
for(int i=L(x); i<=n; i++) {
cnt[a[i]]++;
if(cnt[a[i]] > ans) {
num = a[i];
ans = cnt[a[i]];
}
if(cnt[a[i]] == ans && a[i] < num) {
num = a[i];
ans = cnt[a[i]];
}
dp[x][belong[i]] = num;
}
} int solve(int l, int r, int x) {
return upper_bound(v[x].begin(), v[x].end(), r) - lower_bound(v[x].begin(), v[x].end(), l);
} int query(int l, int r) {
int num = dp[belong[l]+][belong[r]-];
int ans = solve(l, r, num);
for(int i=l; i<=min(r, R(belong[l])); i++) {
int t = solve(l, r, a[i]);
if(t > ans) {
ans = t;
num = a[i];
}
if(t == ans && a[i] < num) {
ans = t;
num = a[i];
}
}
if(belong[l] == belong[r]) return num;
for(int i=L(belong[r]); i<=r; i++) {
int t = solve(l, r, a[i]);
if(t > ans) {
ans = t;
num = a[i];
}
if(t == ans && a[i] < num) {
ans = t;
num = a[i];
}
}
return num;
} int main() {
while(~scanf("%d", &n)) {
block = sqrt(n);
for(int i=; i<=n; i++) {
scanf("%d", &a[i]);
belong[i] = (i-) / block + ;
b[i] = a[i];
}
sort(b+, b++n);
int nn = unique(b+, b++n) - (b+);
for(int i=; i<=n; i++) {
a[i] = lower_bound(b+, b++nn, a[i]) - b;
v[a[i]].push_back(i);
}
for(int i=; i<=belong[n]; i++) handle(i);
m = n;
while(m--) {
int l, r;
scanf("%d%d", &l, &r);
int ans = query(l, r);
printf("%d\n", b[ans]);
}
}
return ;
}
LOJ#6285. 数列分块入门 9的更多相关文章
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
- loj#6285 数列分块入门 9 ( 回 滚 )
题目 : 链接 :https://loj.ac/problem/6285 题意:给出一个长为 n的数列,以及 n个操作,操作涉及询问区间的最小众数. 思路:虽然这不是一道 回滚莫队题,就是 暴力分块 ...
- LOJ6277~6285 数列分块入门
Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列, ...
- LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)
#6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1 题目描述 给出 ...
- LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)
#6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5 题目描述 给出 ...
- LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
#6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个 ...
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给 ...
随机推荐
- java list 去重
Guava ImmutableSet源码去重处理,Hash处理 - 汪小哥 - CSDN博客 https://blog.csdn.net/u012881904/article/details/6895 ...
- 注入技术--LSP劫持注入
1.原理 简单来说,LSP就是一个dll程序. 应用程序通过winsock2进行网络通信时,会调用ws2_32.dll的导出函数,如connect,accept等. 而后端通过LSP实现这些函数的底层 ...
- python生成个性二维码学习笔记
在linux环境下进行编码 1.先进家目录,自行创建Code文件夹 cd Code 2.下载MyQR库 sudo pip3 install MyQR 3.下载所需资源文件并解压 Code/ $ wge ...
- dom 事件主要内容
一 . onclick(单击) 原图 单击btn1 在点击btn2 二 . onfocus 和 onblur onfocus(聚焦, 鼠标点击输入框) onblur(模糊, 鼠标点击输入框外的地方) ...
- python之路--反射
一 . isinstance, type, issubclass isinstance 可以判断该对象是否是XXX家族体系中的(只能往上判断) class Base: pass class Foo(B ...
- elasticsearch的映射
一.简介: 映射:在创建索引时,可以预先定义字段的类型(映射类型,也就是type,一个索引可以有一个或多个类型)及相关属性. Elasticsearch会根据JSON源数据的基础类型猜测你想要的字段映 ...
- 如何在DataTemplate中绑定RadioButton的Checked事件
在我们的项目中经常要用到数据模板,最近做的一个项目中在数据模板中要放一些RadioButton,其中每一个RadioButton设置了Checked事件,如果直接在View层写Checked事件的话不 ...
- css & clearfix & clear-fixed
css & clearfix & clear-fixed https://zzk.cnblogs.com/my/s/blogpost-p?Keywords=clearfix .grou ...
- Python自动化运维ansible从入门到精通
1. 下载安装 在windows下安装ansible:
- Ehlib(Delphi控件) v9.2.024 D7-XE10.2 免费绿色特别版
下载地址:https://www.jb51.net/softs/579413.html#downintro2 EHLib是一个DELPHI 下的非常棒的第三方Grid控件,比DELPHI自带的强大许多 ...