LOJ-6285-数列分块入门9
链接:
题意:
给出一个长为 的数列,以及 个操作,操作涉及询问区间的最小众数。
思路:
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的更多相关文章
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
- loj#6285 数列分块入门 9 ( 回 滚 )
题目 : 链接 :https://loj.ac/problem/6285 题意:给出一个长为 n的数列,以及 n个操作,操作涉及询问区间的最小众数. 思路:虽然这不是一道 回滚莫队题,就是 暴力分块 ...
- LOJ#6285. 数列分块入门 9
有点难..... 要求区间众数,所以我可以先把区间分块,然后我预处理出从第 i 块到第 j 块的众数,用dp[i][j]记录下来. 因为需要知道众数的num值, 所以我可以用一个vector来保存每个 ...
- 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 题目描述 给 ...
随机推荐
- 5分钟快速安装Redmine项目管理软件
公司还在使用Excel.project.word来管理项目吗?时间一长.项目参与的人多.就出现了断断续续无法连续跟踪的问题.终于忍受不了公司这种陈旧的项目管理手段了,于是花了一些时间研究了市面上常见的 ...
- ASP.NET MVC Model 验证总结
http://www.wyjexplorer.cn/Post/2012/8/3/model-validation-in-aspnet-mvc3 ASP.NET MVC3中的Model是自验证的,这是通 ...
- Python assert 关键字
Python assert(断言)用于判断一个表达式,在表达式条件为 False 的时候触发异常. 断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况. 语法格式: ...
- Lombok的使用与原理
在面向对象编程中必不可少需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此.相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而 ...
- 设计模式:解释器模式(Interpreter)
为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...
- [转载]static in Java
来源:https://www.cnblogs.com/chenssy/p/3386721.html 一. static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现 ...
- es6编译器(babel搭建)
1.安装Node.js,初始化项目 npm init -y 2.安装babel-cli(兼容至ie7) npm i @babel/core @babel/cli @babel/preset-env - ...
- laravel 5.7 引入Illuminate\Http\Request 在类内调用 Request 提示不存在的问题
laravel报错: ReflectionException Class App\Http\Controllers\Request does not exist 解决办法: namespace App ...
- openlayers之天地图为底图 叠加其他底图 加载遇到的各种报错
今天以前使用天地图为底图时,map里source的定义:http://t3.tianditu.com~~~ 今天突然报跨域的错误,原有地址访问受限,可是key值是有的 最后发现就是前半段的原因 将前半 ...
- 转 eclipse 快捷键
1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...