BZOJ 4241 分块
思路:
考虑分块
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 分块的更多相关文章
- bzoj 4241 历史研究——分块(区间加权众数)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 套路:可以大力预处理,如果求区间加权众数,可以预处理i~j块(或 j 位置)的最大值, ...
- BZOJ.4241.历史研究(回滚莫队 分块)
题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...
- BZOJ 4241 历史研究(分块)
题意 题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> ...
- BZOJ 4241: 历史研究——莫队 二叉堆
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:N个int范围内的数,M次询问一个区间最大的(数字*出现次数)(加权众数),可以 ...
- BZOJ 4241 历史研究
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- bzoj 2821 分块处理
大题思路就是分块,将n个数分成sqrt(n)个块,然后 处理出一个w数组,w[i,j]代表第i个块到第j个块的答案 那么对于每组询问l,r如果l,r在同一个块中,直接暴力做就行了 如果不在同一个块中, ...
- bzoj 2741 分块+可持久化trie
多个询问l,r,求所有子区间异或和中最大是多少 强制在线 做法: 分块+可持久化trie 1.对于每块的左端点i,预处理出i到任意一个j,()i,j)间所有子区间异或和中最大为多少,复杂度O(\(n\ ...
- bzoj 2821 分块
分块: 先预处理,将原序列分成长度为len的许多块,计算从第i块到第j块的答案,(可以做到O(n*n/len)). 每次询问时,将询问的区间分成三部分,:左边,中间,右边,中间是尽量大的一个块区间,其 ...
- BZOJ - 2741 分块维护最大连续异或和
题意:给定\(a[l...r]\),多次询问区间\([l,r]\)中的最大连续异或和\(a_i⊕a_{i+1}⊕...⊕a_{j},l≤i≤j≤r\) 一眼过去认为是不可做的,但题目给出\(n=1.2 ...
随机推荐
- win10下mysql安装过程中遇到的各种坑
前几天重装系统,又要下回来mysql,但没想到还是遇到了许多麻烦,翻了十多篇博文才搞定,写个总结出来方便以后不要重复踩坑,也给大家参考参考. 1.下载与安装 这个没什么好说的,下载地址网上一大堆,安装 ...
- 几个概念:x86、x86-64和IA-32、IA-64
最近在学习操作系统方面的知识,学习操作系统难免要和CPU打交道,虽然现在CPU和操作系统不像计算机发展初期一样是绑定在一起的,但是大家都知道操作系统和CPU Architecture的联系是很紧密的, ...
- Linux常用命令学习随笔
1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: ls -a 列出目录所有文 ...
- let var const
eslint要求变量声明使用const的,而不是let和var如果可能的话. 如果一个变量只有在声明时才被赋值一次,那么应该使用'const' 'use strict';(function() { v ...
- mac 安装卸载python
第 1 步,删除框架: sudo rm -rf /Library/Frameworks/Python.framework/Versions/x.x第 2步,删除应用目录: sudo rm -rf &q ...
- Nginx 支持websocket的配置
Nginx 支持websocket的配置server { listen 80; server_name 域名; location / { proxy_pass http://127.0.0.1:808 ...
- mongoDB authentication
转自:http://blog.csdn.net/allen_jinjie/article/details/9235073 1. 最开始的时候,我们启动mongodb,但是不包含--auth参数: E: ...
- javascript事件列表解说
javascript事件列表解说 事件 浏览器支持 解说 一般事件 onclick IE3.N2 鼠标点击时触发此事件 ondblclick IE4.N4 鼠标双击时触发此事件 onmousedown ...
- There are no packages available for installation. Sublime3解决方法
最近在学习Vue,在配置sublime3的时候,想要高亮vue的语法,下载点插件 Package Control的时候,总报 There are no packages available for ...
- USB OTG学习笔记
仅仅看了半天SPEC写的笔记,有些乱,等调试完毕再次整理,思路不是很成熟,推测成分较多,可能有不对的地方,欢迎拍砖交流指正. 1. 概要 OTG设备使用插头中的ID引脚来区分A/B Dev ...