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 题目描述 给 ...
随机推荐
- CentOS下Vim加密解密文本
CentOS用vim/vi给文件加密和解密 一. 利用 vim/vi 加密: 优点:加密后,如果不知道密码,就看不到明文,包括root用户也看不了: 缺点:很明显让别人知道加密了,容易让别人把加密的文 ...
- Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)
Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...
- 目前最新u盘启动快捷热键一览表
现在重装系统已不再是件难事了,一个普通的u盘就可以帮你搞定,但是对于一些新手来说在使用u盘启动盘安装系统是也许会遇到这样的小问题,面对一台新电脑时不知道该如何让电脑优先访问u盘从而进入PE系统下进行装 ...
- 【Linux开发】linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想
linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- selenium-server--chromedriver环境
x 准备环境: 1.selenium-server-standalone-3.8.1.jar 2.chromedriver.exe 一.查看本地电脑chrome浏览器版本信息: 二.访问代理地址:ht ...
- appium环境搭建(二)----搭建android开发环境
一.安装Java环境: java 环境分JDK 和JRE ,JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. JRE ...
- Java小知识----POI事件模式读取Excel 2007
一.知识背景 1.读取excel的方法选择问题 java中读excel中的时间,我们通常用POI去解析,在使用new HSSFWorkbook(NEW FileInputStream(excelFil ...
- round函数——银行家舍入算法
在处理四舍五入时,相信大部分人会使用math.round函数(不同的语言应该都有).有没有考虑过,这个函数是不是自己所需要的? po主碰到的问题是用来计算平均分.有个顶真的学生反映,明明是86.5,怎 ...
- liunx crontab 定时访问指定url
链接主机 crontab -e 打开文件,直接输入需要执行的脚本 1 9 * * * /usr/bin/curl http://www.baidu.com 语法解析 * * * * * /usr/bi ...
- redis 学习(13)-- BitMap
BitMap 什么是 BitMap BitMap,即位图,其实也就是 byte 数组,用二进制表示,只有 0 和 1 两个数字. 如图所示: 重要 API 命令 含义 getbit key offse ...