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,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中 ...
随机推荐
- 工控安全入门(五)—— plc逆向初探
之前我们学习了包括modbus.S7comm.DNP3等等工控领域的常用协议,从这篇开始,我们一步步开始,学习如何逆向真实的plc固件. 用到的固件为https://github.com/ameng9 ...
- SpringBooot- 访问时,默认有弹出认证
SpringBooot- 访问时,默认有弹出认证 springboot启动成功后,访问请求时,默认弹出窗口,需登录认证. 原因: 是由于使用了springsecurity的默认安全策略,解决方案:启动 ...
- Veristand学习札记(3)- CD的开发
转载:https://blog.csdn.net/mfcjishiben/article/details/79417739 1 CustomDevice开发 CD的开发必须遵照NI提供的模板进行.安装 ...
- Spring Cloud Alibaba迁移指南(二):零代码替换 Eureka
自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作<Spring Cloud Alibaba迁移指南>系列文章,向开发者提供更多 ...
- jquery版的网页倒计时效果
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- MySQL:比较两个数据表不同部分
简单比较 1.SELECT * FROM t2 WHERE id NOT IN (SELECT id FROM t1); 2.SELECT * FROM t2 WHERE NOT EXISTS(SEL ...
- linux 修改命令提示符&ubuntu目录颜色个性化
1.linux 命令提示符个性化 在 ANSI 兼容终端(例如 xterm.rxvt.konsole 等)里, 可以用彩色显示文本而不仅仅是黑白. 本文示范了如何使用粗体和彩色的文字. 相信每 ...
- Web前端开发的就业前景怎么样,薪资待遇如何
信息技术的迅速发展,使IT技术者们赶上了一个百年难遇的好机会,尤其是国家出台了“互联网+”的政策后,更是催生了IT行业的就业空间,使其呈现爆发性增长. 如今,微信逐渐成为了大家主要的交流工具,随着各种 ...
- 个人站长建议直接封掉的IP地址列表
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="164.100.196.21 ...
- mysql过多sleep连接 修改timeout配置节约连接数 配置连接数
数据库连接数量我设置了16384,最大值 ; 对于mysql8在设置一下这个 SET GLOBAL mysqlx_max_connections = ; 可以使用 命令查看自己的设置 SHOW var ...