链接:

https://loj.ac/problem/6285

题意:

给出一个长为 的数列,以及 个操作,操作涉及询问区间的最小众数。

思路:

vector维护每个值的出现位置, 预处理第i快到第j块 的众数,然后对不成块的跑暴力,

数组开小了一直wa..找题解,好多题解代码也过不了...

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
//#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#include <string>
#include <assert.h>
#include <iomanip>
#define MINF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
const int MOD = 10007; int a[MAXN], b[MAXN], Tag[MAXN];
int Num[MAXN];
int Dp[2010][2010];
int Belong[MAXN];
bool Vis[MAXN];
vector<int> Number[MAXN];
int n, part, pos; inline int read()
{
int ret = 0, c, f = 1;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-') f = -1, c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * 10 + c - '0';
if(f < 0) ret = -ret;
return ret;
} void Init(int x)
{
int MaxNum = 0;
int Mode = 0;
memset(Num, 0, sizeof(Num));
for (int i = (x-1)*part+1;i <= n;i++)
{
int p = Belong[i];
Num[a[i]]++;
if (Num[a[i]] > MaxNum)
{
MaxNum = Num[a[i]];
Mode = a[i];
}
if (Num[a[i]] == MaxNum && Mode > a[i])
Mode = a[i];
Dp[x][p] = Mode;
}
} int GetCnt(int l, int r, int v)
{
// int lp = lower_bound(Number[v].begin(), Number[v].end(), l)-Number[v].begin();
// int rp = upper_bound(Number[v].begin(), Number[v].end(), r)-Number[v].begin();
// return rp-lp+1;
vector<int>::iterator x = upper_bound(Number[v].begin(), Number[v].end(), r);
vector<int>::iterator y = lower_bound(Number[v].begin(), Number[v].end(), l);
return x - y ;
} int Query(int l, int r)
{
int mode = Dp[Belong[l]+1][Belong[r]-1];
int MaxNum = GetCnt(l, r, mode);
memset(Vis, 0, sizeof(Vis));
Vis[mode] = 1;
for (int i = l;i <= min(Belong[l]*part, r);i++)
{
if (Vis[a[i]])
continue;
Vis[a[i]] = 1;
int cnt = GetCnt(l, r, a[i]);
if (cnt > MaxNum || (MaxNum == cnt && a[i] < mode))
{
MaxNum = cnt;
mode = a[i];
}
}
if (Belong[l] != Belong[r])
{
for (int i = max((Belong[r]-1)*part+1, l);i <= r;i++)
{
if (Vis[a[i]])
continue;
Vis[a[i]] = 1;
int cnt = GetCnt(l, r, a[i]);
if (cnt > MaxNum || (MaxNum == cnt && a[i] < mode))
{
MaxNum = cnt;
mode = a[i];
}
}
}
return mode;
} int main()
{
// scanf("%d", &n);
n = read();
part = 80;
memset(Tag, -1, sizeof(Tag));
for (int i = 1;i <= n;i++)
{
// scanf("%d", &a[i]);
a[i] = read();
b[i] = a[i];
Belong[i] = (i-1)/part+1;
}
sort(b+1, b+1+n);
pos = unique(b+1, b+1+n)-(b+1);
for (int i = 1;i <= n;i++)
a[i] = lower_bound(b+1, b+1+pos, a[i])-b; for (int i = 1;i <= Belong[n];i++)
Init(i);
for (int i = 1;i <= n;i++)
Number[a[i]].push_back(i);
int op, l, r, c;
for (int i = 1;i <= n;i++)
{
// scanf("%d%d", &l, &r);
l = read(), r = read();
printf("%d\n", b[Query(l, r)]);
} return 0;
}

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. LOJ#6285. 数列分块入门 9

    有点难..... 要求区间众数,所以我可以先把区间分块,然后我预处理出从第 i 块到第 j 块的众数,用dp[i][j]记录下来. 因为需要知道众数的num值, 所以我可以用一个vector来保存每个 ...

  4. LOJ6277~6285 数列分块入门

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Ubuntu18.04两步纯小白傻瓜无脑式安装Caffe

    前言 Ubuntu16安装caffe过于繁琐,然而Ubuntu18安装起来却仅仅两步而已 附上官方安装教程:http://caffe.berkeleyvision.org/install_apt.ht ...

  2. Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game)

    Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game) 爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需 ...

  3. 轻度折腾nuc8i5beh

    最近入手了一台迷你电脑:Intel NUC--Next Unit of Computing,配了1根16GB内存条(2666)和两块固态(m.2+sata),搭载i5-8259U ,Intel Iri ...

  4. VirtualBox下Centos6.8网络配置

    win10环境下,VirtualBox和Centos6.8已经按照完毕,下面配置Centos6.8网络. 1.设置VirtualBox为桥接模式,具体的有三种联网方法,我们参考http://www.c ...

  5. Spring中重要的注解

    现在大部分的Spring项目都会用到注解.使用注解来替换xml,一行简单的注解就可以解决很多事情.但是你真的懂其中的原理吗. 本文翻译于 https://docs.spring.io/spring-f ...

  6. Elasticsearch-更新现有文档

    ES-更新现有文档 ES的更新API允许发送文档所需要做的修改,而且API会返回一个答复,告知操作是否成功.更新流程如下 1. 检索现有的文档.为了使这步奏效,必须打开_source字段,否则ES并不 ...

  7. Palindromic Substrings

    Given a string, your task is to count how many palindromic substrings in this string. The substrings ...

  8. [转帖]Windows 下如何配置Oracle ASM???

    Windows 下如何配置Oracle ASM??? candon123关注10人评论16725人阅读2011-02-09 21:40:57   本篇介绍了如何在windows下创建裸设备,并创建AS ...

  9. Codeforces Round #603 F Economic Difficulties

    题目大意 给你两棵树,结点分别是1-A与1-B,然后给了N台设备,并且A树和B树的叶子结点(两棵树的叶子节点数量相同)都是链接电机的.问,最多可以删掉几条边使得每个设备都能连到任意一棵(或两棵)树的根 ...

  10. 特产网站自适应CSS

    下面是一个特产网站自适应CSS,这个特产自适应CSS通过屏幕宽度大小来进行适应的,而不是根据UA来判断,就加快了判断的速度,所以速度很快 中国特产站排名还是很好的,特别是手机端 li { list-s ...