有点难.....

要求区间众数,所以我可以先把区间分块,然后我预处理出从第 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的更多相关文章

  1. LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)

    #6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给 ...

  2. loj#6285 数列分块入门 9 ( 回 滚 )

    题目 :  链接 :https://loj.ac/problem/6285 题意:给出一个长为 n的数列,以及 n个操作,操作涉及询问区间的最小众数. 思路:虽然这不是一道 回滚莫队题,就是 暴力分块 ...

  3. LOJ6277~6285 数列分块入门

    Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列, ...

  4. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

    #6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  5. LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)

    #6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  6. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

    #6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1   题目描述 给出 ...

  7. LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)

    #6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5   题目描述 给出 ...

  8. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

    #6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论   题目描述 给出一个 ...

  9. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))

    #6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3   题目描述 给 ...

随机推荐

  1. Booth乘法

    先看一个例子,结合疑问看算法. 1.已知X=+0.0011 Y=-0.1011 求[XY]补 解:[x]补 =0.0011 , [-x]补 =1.1101,[y]补 =1.0101 部分积      ...

  2. phantomjs 了解

    转自:http://www.cnblogs.com/lei0213/ PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎.它原生支持多种web 标准:DOM 操作,CSS选择器,JS ...

  3. OpenCV__type()返回的数字

    OpenCV中的类型以宏定义的形式给出 type_c.h中片段 #define CV_CN_MAX 512 #define CV_CN_SHIFT 3 #define CV_DEPTH_MAX (1 ...

  4. csrf补充

    问csrftoken在Django里面是基于什么实现的?------>中间件. 如果是Django表示每次发请求过来的时候,要检验有没有带随机字符串.当在执行视图函数之前,前面还有一道屏障,这个 ...

  5. Python创建virtualenv(虚拟环境)方法

    本文目录 一 前言 二 通过virtualenv软件创建 三 在pycharm下创建 新建项目 四 已有项目使用和创建虚拟环境 五 参数说明 一 前言 需求:        --公司之有一台服务器   ...

  6. 集合之TreeMap(含JDK1.8源码分析)

    一.前言 前面所说的hashMap和linkedHashMap都不具备统计的功能,或者说它们的统计性能的时间复杂度都不是很好,要想对两者进行统计,需要遍历所有的entry,时间复杂度比较高,此时,我们 ...

  7. WEX5中ajax跨域访问的几种方式

    1.使用jsonp方式 使用jsonp访问的话,前端需要把回调函数名传递给后端,后端执行完后也需要把回调函数传回给前端,默认情况下ajax自动生成一个回调函数名,后端可以通过String callba ...

  8. ajax查看详细返回信息

    查看详细成功返回信息: success : function(data, textStatus, jqXHR) { console.log(data); console.log(textStatus) ...

  9. 【python练习题】程序16

    #题目:输出指定格式的日期. import time print (time.strftime('%Y:%m:%d %X',time.localtime(time.time())))

  10. easy install 与pip

    easy_insall的作用和perl中的cpan, ruby中的gem类似,都提供了在线一键安装模块的傻瓜方便方式,而pip是easy_install的改进版, 提供更好的提示信息,删除packag ...