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 题目描述 给 ...
随机推荐
- numpy的divide函数
和直接用/一样,都是矩阵的对应元素相除. 如果用*,那么是矩阵的对应元素相乘. 如果要实现矩阵乘法,用numpy的dot函数.
- Jenkins 启动不来的排查方法
1.通过 ps -ef | grep tomcat找到jenkins的路径,下有logs,可以查看日志 2.装插件报错时,报错信息里会提示依赖的插件版本号,到jenkins官网下载对应版本的插件即可, ...
- linux批量删除
find . -name "*.bcp" | xargs rm -rf "*.bcp"
- HanLP-停用词表的使用示例
停用词表的修改 停用词表在“pyhanlp\static\data\dictionary”路径下的“stopwords.txt”文件中,CoreStopWordDictionary.apply方法支持 ...
- liunx crontab 定时访问指定url
链接主机 crontab -e 打开文件,直接输入需要执行的脚本 1 9 * * * /usr/bin/curl http://www.baidu.com 语法解析 * * * * * /usr/bi ...
- 使用chattr禁止文件被删除
chattr 是个啥? chattr 修改文件在Linux第二扩展文件系统(E2fs)上的特有属性 使用方法 +i or -i 设置/取消文件不能进行修改:即你不能删除它, 也不能给它重新命名,你不能 ...
- Java设计模式之外观模式和最少知识原则
外观模式: 外观模式:提供一个统一的接口,来访问子系统中一群功能相关接口(类似一键启动,一键关闭等等) 外观模式定义了一个高层接口,让子系统更容易使用 降低对外接口耦合度 外观模式和命令模式各自侧重点 ...
- 如何在LinuxKernel中操作file(set_fs與get_fs)
在Kernel 中,照理說能存取至 0 ~ 4GB.但是實作層面卻是只能讓我們使用到3GB ~ 4GB 這會導致我們無法使用open(),write()這些在user space下的function. ...
- ASP.NET CORE CACHE的使用(含MemoryCache,Redis)
原文:ASP.NET CORE CACHE的使用(含MemoryCache,Redis) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接 ...
- Linux内核、mysql内核、Tcp/Ip内核、java等知识书籍
LINUX <linux内核设计与实现>(2011年出版,链接:https://pan.baidu.com/s/107hriLNVt05A8egeU8Du-g 密码:0cgn) < ...