题目连接

很显然可以想到分块,用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. Java基础程序与面向对象

    首先,我们需要了解和知道一些Java的基本概念: 程序编译过程:.java文件会通过编译器--被编译成一个. class字节码文件---再由虚拟机运行.class文件解释运行Java程序. 编码规范: ...

  2. JSP四大域对象与九大内置对象

    什么是内置对象? 在jsp开发中会频繁使用到一些对象,如 ServletContext.HttpSession.PageContext 等: 如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手 ...

  3. 【php实现数据结构】单向链表

    什么是单向链表 链表是以链式存储数据的结构,其不需要连续的存储空间,链表中的数据以节点来表示,每个节点由元素(存储数据)和指针(指向后继节点)组成. 单向链表(也叫单链表)是链表中最简单的一种形式,每 ...

  4. videojs使用的常见问题

    1.报错The play() request was interrupted by a new load request 我在动态更换video的url时会报这个错.修改一下原来的代码如下,就正常了 ...

  5. python-基础-练习和面试题

    给程序传参数 import sys print(sys.argv) 运行结果: 列表推导式 所谓的列表推导式,就是指的轻量级循环创建列表 1. 基本的方式 2. 在循环的过程中使用if 3. 2个fo ...

  6. MySQL 报错:Translating SQLException with SQL state '42000', error code '1064', message

    MySQL报错详细日志 2019-09-12 16:42:29 [http-nio-80-exec-25] DEBUG [org.springframework.jdbc.support.SQLErr ...

  7. Luogu P3953 逛公园(最短路+记忆化搜索)

    P3953 逛公园 题面 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园的入口,\(N\) 号点是公 ...

  8. TZ_16_Vue定义全局组件和局部组件

    1.定义全局组件 我们通过Vue的component方法来定义一个全局组件. <div id="app"> <!--使用定义好的全局组件--> <co ...

  9. Oracle基础知识:DECODE、NVL

    select 1 from PMADW.GET_WX_DATAPUSH_NEW_CHECK A INNER JOIN PMADW.V_EXCEPTION_QTY_MAIN B on DECODE( A ...

  10. JQuery或JS判断浏览器内核版本号以及是否支持W3C盒子模型

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support .在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...