Description

IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记。JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件。
日记中记录了连续N天发生的时间,大约每天发生一件。
事件有种类之分。第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大。
JOI教授决定用如下的方法分析这些日记:
1. 选择日记中连续的一些天作为分析的时间段
2. 事件种类t的重要度为t*(这段时间内重要度为t的事件数)
3. 计算出所有事件种类的重要度,输出其中的最大值
现在你被要求制作一个帮助教授分析的程序,每次给出分析的区间,你需要输出重要度的最大值。

Input

第一行两个空格分隔的整数N和Q,表示日记一共记录了N天,询问有Q次。
接下来一行N个空格分隔的整数X1...XN,Xi表示第i天发生的事件的种类
接下来Q行,第i行(1<=i<=Q)有两个空格分隔整数Ai和Bi,表示第i次询问的区间为[Ai,Bi]。

Output

输出Q行,第i行(1<=i<=Q)一个整数,表示第i次询问的最大重要度

Sample Input

5 5
9 8 7 8 9
1 2
3 4
4 4
1 4
2 4

Sample Output

9
8
8
16
16

HINT

1<=N<=10^5
1<=Q<=10^5
1<=Xi<=10^9 (1<=i<=N)

Solution

学回滚莫队的契机是昨晚上$gay$哥在$Loj$群里问区间莫队的做法,

然后一位大爷提到回滚莫队这种东西,我感觉挺有意思的就学了一下……

讲解

看完就成回滚莫队板子题了QwQ

Code

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N (100009)
#define LL long long
using namespace std; struct Que{int l,r,num; LL ans;}Q[N];
int n,m,unit,pos=;
int a[N],b[N],v[N],ID[N],Keg[N];
LL ans; bool cmp1(Que x,Que y) {return ID[x.l]==ID[y.l]?x.r<y.r:ID[x.l]<ID[y.l];}
bool cmp2(Que x,Que y) {return x.num<y.num;} LL Calc(int l,int r)
{
LL ans=;
for (int i=l; i<=r; ++i) Keg[b[i]]=;
for (int i=l; i<=r; ++i)
Keg[b[i]]++, ans=max(ans,(LL)Keg[b[i]]*a[i]);
for (int i=l; i<=r; ++i) Keg[b[i]]=;
return ans;
} void Update(int x)
{
Keg[b[x]]++;
ans=max(ans,(LL)Keg[b[x]]*a[x]);
} void MoQueue(int num)
{
ans=;
for (int i=; i<=n; ++i) Keg[i]=;
int L=min(unit*num,n);
int l=L+,r=L;
while (ID[Q[pos].l]==num)
{
if (ID[Q[pos].l]==ID[Q[pos].r])
{
Q[pos].ans=Calc(Q[pos].l,Q[pos].r);
++pos; continue;
}
while (r<Q[pos].r) Update(++r);
LL tmp=ans;
while (l>Q[pos].l) Update(--l);
Q[pos].ans=ans; ans=tmp;
while (l<L+) Keg[b[l]]--, l++;
++pos;
}
} int main()
{
scanf("%d%d",&n,&m);
unit=sqrt(n);
for (int i=; i<=n; ++i)
scanf("%d",&a[i]), v[i]=a[i];
sort(v+,v+n+);
int num=unique(v+,v+n+)-v-;
for (int i=; i<=n; ++i)
b[i]=lower_bound(v+,v+num+,a[i])-v; for (int i=; i<=m; ++i)
scanf("%d%d",&Q[i].l,&Q[i].r), Q[i].num=i; int cnt=n/unit+(n%unit!=);
for (int i=; i<=n; ++i)
ID[i]=(i-)/unit+; sort(Q+,Q+m+,cmp1);
for (int i=; i<=cnt; ++i)
MoQueue(i);
sort(Q+,Q+m+,cmp2);
for (int i=; i<=m; ++i)
printf("%lld\n",Q[i].ans);
}

BZOJ4241:历史研究(回滚莫队)的更多相关文章

  1. BZOJ4241历史研究——回滚莫队

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

  2. bzoj4241/AT1219 历史研究(回滚莫队)

    bzoj4241/AT1219 历史研究(回滚莫队) bzoj它爆炸了. luogu 题解时间 我怎么又在做水题. 就是区间带乘数权众数. 经典回滚莫队,一般对于延长区间简单而缩短区间难的莫队题可以考 ...

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

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

  4. 「JOISC 2014 Day1」历史研究 --- 回滚莫队

    题目又臭又长,但其实题意很简单. 给出一个长度为\(N\)的序列与\(Q\)个询问,每个询问都对应原序列中的一个区间.对于每个查询的区间,设数\(X_{i}\)在此区间出现的次数为\(Sum_{X_{ ...

  5. 【题解】BZOJ4241: 历史研究(魔改莫队)

    [题解]BZOJ4241: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究 ...

  6. AT1219 歴史の研究 回滚莫队

    可在vj上提交:https://vjudge.net/problem/AtCoder-joisc2014_c 题意: IOI 国历史研究的第一人--JOI 教授,最近获得了一份被认为是古代 IOI 国 ...

  7. AT1219 歴史の研究[回滚莫队学习笔记]

    回滚莫队例题. 这题的意思大概是 设 \(cnt_i\) 为 l ~ r 这个区间 \(i\) 出现的次数 求\(m\) 次询问 求 l~r 的 max {\(a_i\) * \(cnt_i\)} \ ...

  8. 【BZOJ4241】历史研究(回滚莫队)

    题目: BZOJ4241 分析: 本校某些julao乱膜的时候发明了个"回滚邹队",大概意思就是某个姓邹的太菜了进不了省队回滚去文化课 回滚莫队裸题qwq(话说这个名字是不是莫队本 ...

  9. 2018.08.14 bzoj4241: 历史研究(回滚莫队)

    传送们 简单的回滚莫队,调了半天发现排序的时候把m达成了n... 代码: #include<bits/stdc++.h> #define N 100005 #define ll long ...

随机推荐

  1. 【转】MyBatis接口的简单实现原理

    MyBatis接口的简单实现原理 用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用? 那是因为MyBatis使用Java动态代理实现的接口. 这里仅仅 ...

  2. JVM内存问题定位

    一.查看机器资源使用状态: 使用top命令,内存占用较高的那个PID对应的进程一般就是JVM了 二.查看Swap状态: 使用free -m 命令,一般内存占用过高会导致swap占用也偏高,看看swap ...

  3. oracle数据同步

    随着各行业信息化水平的不断提升,各种各样的信息管理系统都被广泛使用,各系统间数据完全独立,形成了大量的信息孤岛.出于管理及决策方面的需求,实现各平台的数据同步是一个很迫切的需求,TreeSoft数据库 ...

  4. MySQL中文编码设置为utf-8

    MySQL中文编码设置为utf-8 原文地址:http://blog.csdn.net/wangnan537/article/details/47819167 1. 查看MySQL数据库的默认编码有如 ...

  5. Linux学习5-初学者注意事项

    1.Linux严格区分大小写     2.Linux中所有内容以文件形式保存,包括硬件 硬盘文件是/dev/sd[a-p] 光盘文件是/dev/sr0等     3.Linux不靠扩展名区分文件类型, ...

  6. Mac下 KGDB连接Linux

    kgdb按照资料说可以使用网络(kgdboe)和串口连接(kgdboc)等方式连接. 这里使用后者,资料比较多,下面是自己在Mac上进行配置连接的过程. 先说一下环境: 主机:Mac OSX 10.1 ...

  7. 第二十四天- 模块导入 import from xxx import xxx

    # 模块:# 模块就是⼀个包含了python定义和声明的⽂件,⽂件名就是模块的名字加上.py后缀# 换句话说我们⽬前写的所有的py⽂件都可以看成是⼀个模块# 为何用模块:写大项目时,把相关的功能进⾏分 ...

  8. mysql 删除某一个数据库下面的所有表,但不删除数据库

    删除某一个数据库下面的所有表,但不删除数据库.该语句经过从concat拼接,最后查询出来的是删除表的语句,然后执行那些查询出来的语句就ok了select concat(‘drop table ‘,ta ...

  9. java运算符优先级别

    算数-->关系-->逻辑-->赋值

  10. 2java.lang.NoClassDefFoundError异常

    1.错误信息 2.错误分析: JVM读到程序的第三行,会在当前路径 "D:\java" 下寻找com.yangquan.aolun这个包路径下的Cat类,但当前路径下根本就没有co ...