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,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中 ...
随机推荐
- k8s 内部各个部件运转
Master节点部署的都是kubernetes的核心模块APIServer提供资源操作的唯一入口,并且提供认证/授权/kubernets的访问控制可以通过kubectl和自己开发的客户端,通过http ...
- PAT甲级——A1025 PAT Ranking
Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...
- docker tomcat启动慢
镜像 https://hub.docker.com/r/errorlife/tomcat/ docker pull errorlife/tomcat
- xshell下载免费版
正在使用的xshell 5不能使用,提示xshell 5评估期已过,重新安装还是不行.其实xshell 5有免费版的,即Home & school 版本.卸载原程序,下载安装免费版本的xshe ...
- 2019-8-31-dotnet-新项目格式与对应框架预定义的宏
title author date CreateTime categories dotnet 新项目格式与对应框架预定义的宏 lindexi 2019-08-31 16:55:58 +0800 201 ...
- 字符串匹配算法之kmp算法
kmp算法是一种效率非常高的字符串匹配算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,所以简称KMP算法 算法思想 在一个字符串中查找另一个字符串时,会遇到如下图的情况 我们通常 ...
- Leetcode559.Maximum Depth of N-ary TreeN叉树的最大深度
给定一个 N 叉树,找到其最大深度. 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数. 说明: 树的深度不会超过 1000. 树的节点总不会超过 5000. class Solution { ...
- LUOGU P1779 魔鬼杀手_NOI导刊2010提高(03)
传送门 解题思路 背包,首先先用aoe都打残然后单伤补刀,用f[i]表示AOE打了i的伤害的最小花费,g[i]表示单伤打了i的伤害的最小花费. 代码 #include<iostream> ...
- UOJ#428. 【集训队作业2018】普通的计数题
#428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...
- Tomcat7 Redis Session共享
1.环境 服务器 centos7 tomcat 7 redis nginx 2.配置tomcat配置文件context.xml <Valve className="com.orange ...