思路:
考虑分块
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. js中获取浏览器和屏幕高度

    Javascript: IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高 ...

  2. 13.javaweb xml标签库详解

    一.XML标签简介 1,  作用 2,  标签分类 XPath 路径标记 查找节点元素示例 2.1<x:out> 2.2<x:parse> 操作示例:导入XML文件,解析,然后 ...

  3. js手机网络检测

    <!DOCTYPE HTML> <html lang="en"> <head> <meta charset=UTF-8"> ...

  4. 解决strip: Unable to recognise the format of the input file问题

    前言   在编译xilinx的uboot的时候出现了一个问题,始终报错:“strip: Unable to recognise the format of the input file `gen_et ...

  5. socket 的通信过程

    1.建立套接字 Linux在利用socket()系统调用建立新的套接字时,需要传递套接字的地址族标识符.套接字类型以及协议,其函数定义于net/socket.c中: asmlinkage long s ...

  6. 企业级任务调度框架Quartz(2)-下载和安装Quartz

    1.下载和安装 Quartz 根据资料上提供的网址http://www.opensymphony.com/quartz 我们可以下载到Quartz的最新版本1.6.4: 2.下载后包的说明       ...

  7. Day 08 字符编码

    字符编码 计算机基础 启动应用程序 1.双击QQ 2.操作系统接受指定然后把该操作转化为0和1发送给CPU 3.CPU接受指令然后把指令发给内存 4.内存接受指令把指令发送给硬盘获取数据 5.QQ在内 ...

  8. C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间

    1 作业讲解 指针间接操作的三个必要条件 两个变量 其中一个是指针 建立关联:用一个指针指向另一个地址 * 简述sizeof和strlen的区别 strlen求字符串长度,字符数组到’\0’就结束 s ...

  9. 【JavaScript框架封装】实现一个类似于JQuery的CSS样式框架的封装

    // CSS 样式框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法)[只要是需要使用到this获取到的元素集合这个变量的时候, ...

  10. HDU-6217 BBP Formula 脑洞

    题目链接:https://cn.vjudge.net/problem/HDU-6217 题意 已知: \[ \pi = \sum_{k=0}^{\infty }\frac{1}{16^{k}}(\fr ...