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 ...
随机推荐
- 问题集锦 ~ CSS
#button标签点击后出现点边框 input {outline: none;} button::-moz-focus-inner {border: none;}
- 离线安装ADT和sdk
重装Eclipse.离线安装ADT.Android SDK 由于最新的ADT.Android SDK需要最新版本的Eclipse才能使用,我无奈的只好升级Eclipse.看看自己的Eclipse已经两 ...
- js页面传值,cookie
// 获取页面穿值 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + " ...
- 为什么java io流必须得关闭
当我们new一个java流对象之后,不仅在计算机内存中创建了一个相应类的实例对象.而且,还占用了相应的系统资源,比如:文件句柄.端口.数据库连接等.在内存中的实例对象,当没有引用指向的时候,java垃 ...
- oracle AWR详解
原文地址:https://blog.csdn.net/elvis_lfc/article/details/52326148 啥是AWR? =============================== ...
- 手动实现aop编程
手动实现aop编程(运用代理模式实现) aop:aspect object programming 功能:让关注点与业务代码分离 关注点:重复代码就叫做关注点 切面:关注点形成的类,就叫切面(类) 面 ...
- nginx日志按日期自动切割脚本
#!/bin/bash #nginx日志切割脚本 #author:setevn #设置日志文件存放目录 logs_path="/usr/local/nginx/logs/" #设置 ...
- WSDL详解(一)
WSDL文档使用web服务描述语言来定义服务. 文档包括逻辑(抽象)部分和具体部分. 抽象部分用于定义独立于实现的数据类型和消息,具体部分定义一个endpoint如何实现一个可以与外界进行交互的服务. ...
- mysql 与 memcache 字段名后面有空格时会产生什么问题(转)
同事下午遇到一问题,MySQL 和 Memcached 对于同一个key,不能对应起来.最终原因是:PHP将key写入MySQL数据库之前,没有经过trim()过滤首尾空格(关键是尾部空格),结果: ...
- 51nod-活动安排问题
有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?分析: 我们就是想提高教室地利用率,尽可能多地安排活动.考虑容易想到的几种贪心策略: (1 ...