BZOJ4241 历史研究(莫队)
如果分块的话与区间众数没有本质区别。这里考虑莫队。
显然莫队时的删除可以用堆维护,但多了一个log不太跑得过。
有一种叫回滚莫队的trick,可以将问题变为只有加入操作。按莫队时分的块依次处理,一块中左端点的差不超过√n,右端点单调递增。首先将右端点也在该块中的询问暴力处理。然后令指针l在下一块开头,指针r在这一块结尾。暴力扩展右端点移动指针r,到达询问点时,移动指针l以回答询问,但不让指针l的移动对之后的询问产生影响,即回滚。这样就可以处理删除了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 100010
#define ll long long
int n,m,a[N],b[N],cnt[N];
ll ans[N];
struct data
{
int x,y,k,i;
bool operator <(const data&a) const
{
return k<a.k||k==a.k&&y<a.y;
}
}q[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4241.in","r",stdin);
freopen("bzoj4241.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
for (int i=;i<=n;i++) b[i]=a[i]=read();
sort(b+,b+n+);
int t=unique(b+,b+n+)-b-;
for (int i=;i<=n;i++) a[i]=lower_bound(b+,b+t+,a[i])-b;
int block=sqrt(n);
for (int i=;i<=m;i++) q[i].x=read(),q[i].y=read(),q[i].k=q[i].x/block,q[i].i=i;
sort(q+,q+m+);
for (int i=;i<=m;i++)
{
int t=i;while (t<m&&q[t+].k==q[i].k) t++;
while (i<=t&&q[i].y<(q[i].k+)*block)
{
for (int j=q[i].x;j<=q[i].y;j++)
{
cnt[a[j]]++;
ans[q[i].i]=max(ans[q[i].i],1ll*cnt[a[j]]*b[a[j]]);
}
for (int j=q[i].x;j<=q[i].y;j++) cnt[a[j]]--;
i++;
}
int r=(q[i].k+)*block-;ll v=;
for (int j=i;j<=t;j++)
{
while (r<q[j].y)
{
cnt[a[++r]]++;
v=max(v,1ll*cnt[a[r]]*b[a[r]]);
}
ans[q[j].i]=v;
for (int k=(q[i].k+)*block-;k>=q[j].x;k--)
{
cnt[a[k]]++;
ans[q[j].i]=max(ans[q[j].i],1ll*cnt[a[k]]*b[a[k]]);
}
for (int k=(q[i].k+)*block-;k>=q[j].x;k--) cnt[a[k]]--;
}
memset(cnt,,sizeof(cnt));
i=t;
}
for (int i=;i<=m;i++) printf(LL,ans[i]);
return ;
}
BZOJ4241 历史研究(莫队)的更多相关文章
- BZOJ4241 历史研究 莫队 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JO ...
- BZOJ 4241: 历史研究——莫队 二叉堆
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:N个int范围内的数,M次询问一个区间最大的(数字*出现次数)(加权众数),可以 ...
- 【题解】BZOJ4241: 历史研究(魔改莫队)
[题解]BZOJ4241: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究 ...
- [JOISC2014]歴史の研究/[BZOJ4241]历史研究
[JOISC2014]歴史の研究/[BZOJ4241]历史研究 题目大意: 一个长度为\(n(n\le10^5)\)的数列\(A(A_i\le10^9)\),定义一个元素对一个区间\([l,r]\)的 ...
- BZOJ4241历史研究——回滚莫队
题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连 ...
- BZOJ4241:历史研究(回滚莫队)
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- 2018.08.14 bzoj4241: 历史研究(回滚莫队)
传送们 简单的回滚莫队,调了半天发现排序的时候把m达成了n... 代码: #include<bits/stdc++.h> #define N 100005 #define ll long ...
- bzoj4241: 历史研究(回滚莫队)
传送门 这是一个叫做回滚莫队的神奇玩意儿 是询问,而且不强制在线,就决定是你了莫队 如果是每次插入一个数是不是很简单? 然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字 那么把它变成只插入不就行了 ...
- BZOJ4241 历史研究 【回滚莫队】
题目描述:给出一个长度为\(n\)的数组,每次询问区间 \([l,r]\),求 \(\max\limits_{x}x*cnt_x\),其中 \(cnt_x\) 表示 \(x\) 在区间 \([l,r] ...
随机推荐
- ORB-SLAM(六)MapPoint与Map
地图点可以通过关键帧来构造,也可以通过普通帧构造,但是最终,必须是和关键帧对应的,通过普通帧构造的地图点只是临时被Tracking用来追踪用的. 构造函数(地图点3D坐标及其参考帧): // 参考帧是 ...
- substr是不安全的
今天遇到一个问题,数据库中保存的内容通过php在页面无法显示,如果将内容换行或加个空格或者随便加点其他内容就能正常显示. 非常的诡异,显示的内容是通过截取得到的.代码非常简单 substr($pMar ...
- 使用materialization
explain select `countries`.`id` AS `id`,`countries`.`sortname` AS `sortname`,`countries`.`name` AS ` ...
- JMeter随机上传附件
方法一: 1.添加一个前置Beanshell 2.输入代码: File folder = new File("/path/to/your/folder/with/audiofiles&quo ...
- 用IDEA编写spark的WordCount
我习惯用Maven项目 所以用IDEA新建一个Maven项目 下面是pom文件 我粘上来吧 <?xml version="1.0" encoding="UTF-8& ...
- 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(下)
第1章.基础篇(下) Abstract: 数据通信.数据存储.动画.音频与视频.canvas.BOM.表单操作.列表操作 数据通信(HTTP协议) HTTP事务: 客户端向服务器端发送HTTP请求报文 ...
- Spring Cloud(六):Hystrix 监控数据聚合 Turbine【Finchley 版】
Spring Cloud(六):Hystrix 监控数据聚合 Turbine[Finchley 版] 发表于 2018-04-17 | 更新于 2018-05-07 | 上一篇我们介绍了使用 H ...
- vue-router爬坑记
简介 因为我们用Vue开发的页面是单页面应用,就相当于只有一个主的index.html,这时候我们就不能使用a标签来进行页面的切换了,所以这时候我们今天的主角Vue-Router就闪亮的登场了 Vue ...
- lintcode 平面列表
问题描述: 给定一个列表,该列表中的每个要素要么是个列表,要么是整数.将其变成一个只包含整数的简单列表. 样例: 给定 [1,2,[1,2]],返回 [1,2,1,2]. 给定 [4,[3,[2,[1 ...
- oracle 学习随笔一: 字段大小写
字段上加大小写:"reportId" 即可