思路:
考虑分块
f[i][j]表示从第i块开头到j的最大值
cnt[i][j]表示从第i块开始到序列末尾j出现了多少次
边角余料处理一下就好啦~

//By SiriusRen
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=;
int n,q,Block,a[N],block[N],cpy[N],u;
int xx,yy,cnt[][N],top,stk[N],num[N];
typedef long long ll;ll f[][N],ans;
int main(){
scanf("%d%d",&n,&q),Block=sqrt(n);
for(int i=;i<=n;i++)scanf("%d",&a[i]),block[i]=(i-)/Block+,cpy[i]=a[i];
sort(cpy+,cpy++n),u=unique(cpy+,cpy++n)-cpy-;
for(int i=;i<=n;i++)a[i]=lower_bound(cpy+,cpy++u,a[i])-cpy;
for(int i=;i<=block[n];i++){
ll now=;
for(int j=lower_bound(block+,block++n,i)-block;j<=n;j++)
cnt[i][a[j]]++,now=max(now,(ll)cnt[i][a[j]]*cpy[a[j]]),f[i][j]=now;
}
while(q--){
scanf("%d%d",&xx,&yy),ans=f[block[xx]+][yy],top=;
int temp=lower_bound(block+,block++n,block[yy])-block;
for(int i=temp;i<=yy;i++)num[a[i]]++,stk[++top]=a[i];
temp=lower_bound(block+,block++n,block[xx]+)-block;
for(int i=xx;i<temp;i++){
num[a[i]]++,ans=max(ans,(ll)(cnt[block[xx]+][a[i]]-cnt[block[yy]][a[i]]+num[a[i]])*cpy[a[i]]);
stk[++top]=a[i];
}
temp=lower_bound(block+,block++n,block[yy])-block;
for(int i=temp;i<=yy;i++)
ans=max(ans,(ll)(cnt[block[xx]+][a[i]]-cnt[block[yy]][a[i]]+num[a[i]])*cpy[a[i]]);
for(int i=;i<=top;i++)num[stk[i]]=;
printf("%lld\n",ans);
}
}

BZOJ 4241 分块的更多相关文章

  1. bzoj 4241 历史研究——分块(区间加权众数)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 套路:可以大力预处理,如果求区间加权众数,可以预处理i~j块(或 j 位置)的最大值, ...

  2. BZOJ.4241.历史研究(回滚莫队 分块)

    题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...

  3. BZOJ 4241 历史研究(分块)

    题意 题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> ...

  4. BZOJ 4241: 历史研究——莫队 二叉堆

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:N个int范围内的数,M次询问一个区间最大的(数字*出现次数)(加权众数),可以 ...

  5. BZOJ 4241 历史研究

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

  6. bzoj 2821 分块处理

    大题思路就是分块,将n个数分成sqrt(n)个块,然后 处理出一个w数组,w[i,j]代表第i个块到第j个块的答案 那么对于每组询问l,r如果l,r在同一个块中,直接暴力做就行了 如果不在同一个块中, ...

  7. bzoj 2741 分块+可持久化trie

    多个询问l,r,求所有子区间异或和中最大是多少 强制在线 做法: 分块+可持久化trie 1.对于每块的左端点i,预处理出i到任意一个j,()i,j)间所有子区间异或和中最大为多少,复杂度O(\(n\ ...

  8. bzoj 2821 分块

    分块: 先预处理,将原序列分成长度为len的许多块,计算从第i块到第j块的答案,(可以做到O(n*n/len)). 每次询问时,将询问的区间分成三部分,:左边,中间,右边,中间是尽量大的一个块区间,其 ...

  9. BZOJ - 2741 分块维护最大连续异或和

    题意:给定\(a[l...r]\),多次询问区间\([l,r]\)中的最大连续异或和\(a_i⊕a_{i+1}⊕...⊕a_{j},l≤i≤j≤r\) 一眼过去认为是不可做的,但题目给出\(n=1.2 ...

随机推荐

  1. sql server restore DB issue

    error occurs when restoring the backup file of sql server(DB.bak) to run the above t-sql will shoot ...

  2. mac os x install redis-3.2.9

    下载.解压.重命名并且编译安装Redis~ wget http://download.redis.io/releases/redis-3.2.9.tar.gz ~ tar xzf redis-3.2. ...

  3. Vtk读取并显示保存图像

    (1):Vtk读取并显示图像:三种方法 转载:未知出处 转载:用VTK显示平面图片:http://blog.csdn.net/tonylk/article/details/464881 用到vtkJP ...

  4. C# 取web应用程序运行目录

    HttpRuntime.AppDomainAppPath

  5. C# 把对象序列化 JSON 字符串 和把JSON字符串还原为对象

    /// <summary> /// 把对象序列化 JSON 字符串 /// </summary> /// <typeparam name="T"> ...

  6. day27-2 pandas模块

    目录 pandas Series(了解) DataFrame 内置方法 处理缺失值 合并数据 取值 把表格传入excel文件中 把表格从excel中取出来 高级(了解) pandas 处理表格等文件/ ...

  7. jmeter录制

    1.添加线程组 2.添加HTTP代理服务 3.浏览器的代理设置 4.添加证书 5.排除模式 .*\.(jpg|css|png|git).*或者 .*\.jpg 6.录制只限制某一个ip段 7.最后一句 ...

  8. java深入的单例模式

    在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下.   所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在 ...

  9. selenium+java处理鼠标悬停

    1.元素比较明确(可视) 2.元素隐藏,需要鼠标移动到一定地方才显现(下图为某论坛列表,需要将鼠标移动到列表才显示操作按钮)

  10. Qt QImage与OpenCV Mat转换

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51029382 应一个朋友的要求,整理总 ...