BZOJ4241历史研究题解
很显然可以想到分块,用f[i][j]表示块i到块j的ans,然后发现答案一定是f[i][j]
或者其他在边角出现的数字
我们在记下g[i][j]从开头到块i中的数字j出现的次数
这样就每一次就统计边角数字出现的次数,然后更新答案就好了
(好像莫对也可以做。。。。)
注意每一次查询时不要memset,会T飞
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
# include<cmath>
using namespace std;
typedef long long LL;
const int mn = ;
int n,m,siz;
int bl[mn],b[mn],c[mn],a[mn];
LL f[][];//块i到j的答案
int g[][mn];//从1到块i中每个数出现的次数
int tmp[mn],st[mn],top;
void pre(int x)
{
LL ans=;
memset(tmp,,sizeof(tmp));
for(int i=;i<=n;i++)
g[x][i]=g[x-][i];
int y=min(n,x*siz);
for(int i=(x-)*siz+;i<=y;i++)
g[x][a[i]]++;
for(int i=(x-)*siz+;i<=n;i++)
{
tmp[a[i]]++;
if(1ll*b[a[i]]*tmp[a[i]]>ans) ans=1ll*b[a[i]]*tmp[a[i]];
if(i%siz==)
f[x][i/siz]=ans;
if(i==n)
f[x][bl[n]]=ans;
}
}
LL ask(int x,int y)
{
LL ans=;
top=;
//memset(tmp,0,sizeof(tmp));
if(bl[x]==bl[y])
{
for(int i=x;i<=y;i++)
{
if(tmp[a[i]]==) st[++top]=a[i];
tmp[a[i]]++;
if(1ll*b[a[i]]*tmp[a[i]]>ans) ans=1ll*b[a[i]]*tmp[a[i]];
}
for(int i=top;i>=;i--)
tmp[st[i]]=;
return ans;
}
else {
if(bl[y]->=bl[x]+) ans=f[bl[x]+][bl[y]-];
for(int i=x;i<=bl[x]*siz;i++)
{
if(tmp[a[i]]==) st[++top]=a[i],tmp[a[i]]=g[bl[y]-][a[i]]-g[bl[x]][a[i]];
tmp[a[i]]++;
if(1ll*b[a[i]]*tmp[a[i]]>ans) ans=1ll*b[a[i]]*tmp[a[i]];
}
for(int i=(bl[y]-)*siz+;i<=y;i++)
{
if(tmp[a[i]]==) st[++top]=a[i],tmp[a[i]]=g[bl[y]-][a[i]]-g[bl[x]][a[i]];
tmp[a[i]]++;
if(1ll*b[a[i]]*tmp[a[i]]>ans) ans=1ll*b[a[i]]*tmp[a[i]];
}
for(int i=top;i>=;i--)
tmp[st[i]]=;
return ans;
}
}
int main()
{
//freopen("4241.in","r",stdin);
//freopen("4241.out","w",stdout);
int x,y;
scanf("%d%d",&n,&m);
siz=sqrt(n*1.0);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b++n);
for(int i=;i<=n;i++)
a[i]=lower_bound(b+,b++n,a[i])-b;
/*for(int i=1;i<=n;i++)
printf("%d ",a[i]);离散化*/
for(int i=;i<=n;i++)
bl[i]=(i-)/siz+;
for(int i=;i<=bl[n];i++)
pre(i);
memset(tmp,,sizeof(tmp));
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
printf("%lld\n",ask(x,y));
}
return ;
}
BZOJ4241历史研究题解的更多相关文章
- BZOJ4241历史研究题解--回滚莫队
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4241 分析 这题就是求区间权值乘以权值出现次数的最大值,一看莫队法块可搞,但仔细想想,莫 ...
- 【题解】BZOJ4241: 历史研究(魔改莫队)
[题解]BZOJ4241: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究 ...
- [JOISC2014]歴史の研究/[BZOJ4241]历史研究
[JOISC2014]歴史の研究/[BZOJ4241]历史研究 题目大意: 一个长度为\(n(n\le10^5)\)的数列\(A(A_i\le10^9)\),定义一个元素对一个区间\([l,r]\)的 ...
- BZOJ4241 历史研究 莫队 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JO ...
- BZOJ4241 历史研究
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- BZOJ4241历史研究——回滚莫队
题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连 ...
- BZOJ4241:历史研究(回滚莫队)
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- [bzoj4241][历史研究] (分块)
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- BZOJ4241 历史研究(莫队)
如果分块的话与区间众数没有本质区别.这里考虑莫队. 显然莫队时的删除可以用堆维护,但多了一个log不太跑得过. 有一种叫回滚莫队的trick,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中 ...
随机推荐
- 深入浅出 Java Concurrency (23): 并发容器 part 8 可阻塞的BlockingQueue (3)[转]
在Set中有一个排序的集合SortedSet,用来保存按照自然顺序排列的对象.Queue中同样引入了一个支持排序的FIFO模型. 并发队列与Queue简介 中介绍了,PriorityQueue和Pri ...
- Web充斥着存在漏洞的过期JavaScript库
虽然使用第三方软件库通常会降低开发的时间,但同时也会增加网站暴露出的攻击表面,对此我们应有充分的认识.因此需要保持第三方软件库的最新版本依赖,以便从安全更新中获益.即便如此,一份近期研究表明,在Ale ...
- Python之路,Day1 - Python基础1(转载Alex)
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...
- SpringBooot- 访问时,默认有弹出认证
SpringBooot- 访问时,默认有弹出认证 springboot启动成功后,访问请求时,默认弹出窗口,需登录认证. 原因: 是由于使用了springsecurity的默认安全策略,解决方案:启动 ...
- Object上的静态方法
内置提供了一个对象为 Object ,也被称之为是构造函数,用来创建对象用的.在 javascript 函数也是对象,是一种可被执行的对象,所以称Object为对象也是可以的.挂在函数上的方法,称之为 ...
- java随机生成字符串工具类
package aA; import java.util.ArrayList; import java.util.Arrays; import java.util.Random; /** * 字符随机 ...
- webpack打包js,css和图片
1.webpack打包默认配置文件webpack.config.js 2.打包js文件:有这个文件并配置可以直接在cmd上webpack打包,没有这个文件要在cmd上输入 webpack main.j ...
- 数组的方法之(Array.prototype.reduce() 方法)
reduce函数 reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值. 对数组中的所有元素调用指定的回调函数.该回调函数的返回值为累积结果,并且此返回值在下一次 ...
- 蛋疼的JavaScript(二)this
### 烦人的this JavaScript的表现与之前学的任何传统的语言都不一样,这个就很烦人,这几天把这个坑扫除了 ### this到底指向什么 总的来说,总结下,this其实取决于调用者的上下文 ...
- 直接在安装了redis的Linux机器上操作redis数据存储类型--对Sorted-Sets操作
一.概述: Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score ...