题目连接

很显然可以想到分块,用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历史研究题解的更多相关文章

  1. BZOJ4241历史研究题解--回滚莫队

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4241 分析 这题就是求区间权值乘以权值出现次数的最大值,一看莫队法块可搞,但仔细想想,莫 ...

  2. 【题解】BZOJ4241: 历史研究(魔改莫队)

    [题解]BZOJ4241: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究 ...

  3. [JOISC2014]歴史の研究/[BZOJ4241]历史研究

    [JOISC2014]歴史の研究/[BZOJ4241]历史研究 题目大意: 一个长度为\(n(n\le10^5)\)的数列\(A(A_i\le10^9)\),定义一个元素对一个区间\([l,r]\)的 ...

  4. BZOJ4241 历史研究 莫队 堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JO ...

  5. BZOJ4241 历史研究

    Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...

  6. BZOJ4241历史研究——回滚莫队

    题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连 ...

  7. BZOJ4241:历史研究(回滚莫队)

    Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...

  8. [bzoj4241][历史研究] (分块)

    Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...

  9. BZOJ4241 历史研究(莫队)

    如果分块的话与区间众数没有本质区别.这里考虑莫队. 显然莫队时的删除可以用堆维护,但多了一个log不太跑得过. 有一种叫回滚莫队的trick,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中 ...

随机推荐

  1. MySQL实战总结

    极客上买了<MySQL实战45讲>,用导图大致总结后,跟大家分享下

  2. devc++读取不了当前目录下的文件

    devc++在当前目录新建了一个文件之后,用文件读取的操作报错:     如图所示:           解决方案: 先把该文件从左侧工作空间中移除:       移除之后就没了:         再 ...

  3. SpringCloud是如何运行的?

    SpringCloud是基于SpringBoot这一高度自动化的应用开发框架,将各类业界比较知名的.得到过实践反馈的开元服务治理相关的技术框架进行优化整合的框架,是一种开发方式的优化和组合,,是一组框 ...

  4. Jmeter设置中文汉化

    下载汉化包logkit-2.0.jar 将汉化包copy至 jmeter文件的lib目录下 打开Jmeter软件,设置汉化包 Options  ->  ChooseLanguage  -> ...

  5. 用sqoop抽取oracle 表到hbase的例子

    sqoop import \-Doraoop.disabled=true \--connect jdbc:oracle:thin:@"(DESCRIPTION=(ADDRESS=(PROTO ...

  6. Django项目:CRM(客户关系管理系统)--31--23PerfectCRM实现King_admin数据删除

    登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html # king_urls.py # ————————02PerfectCRM创建ADMIN页面—— ...

  7. SOFARPC学习(一)

    接触SOFARPC,是从一个好朋友(女程序媛)的推荐开始,目的是从头到尾了解这个框架,包括使用方法和源码解析. 当学习一个新东西的事物,我总喜欢先总体把握,在深入细节,这样就可以有种高屋建瓴的感觉,否 ...

  8. 【linux配置】Redhat6.5基础配置指南

    Redhat6.5基础配置指南 本文针对鄙人在工作中常用系统配置加以说明,通常公司用于生产和测试的服务器基本上都不能连接外网,需要针对刚刚安装好的系统做一系列的常用配置. 一.常用基础系统配置 1.关 ...

  9. 碰撞的小球 ccf (模拟)

    问题描述 试题编号: 201803-2 试题名称: 碰撞的小球 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐 ...

  10. 常见的HTML标签的嵌套规则

    众所周知,HTML标签有两类: 块级元素div.h1~h6.address.blockquote.center.dir.dl.dt.dd.fieldset.form.hr.isindex.menu.n ...