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. SpringBoot+Swagger2 整合

    SpringBoot+Swagger2四步整合 第一步:添加相关依赖 <parent> <groupId>org.springframework.boot</groupI ...

  2. vue+SSM验证码实现

    源码:https://github.com/HannahLihui/StudentManager-SSM/tree/master/SSM-git/StudentManager-SSM-master 1 ...

  3. 使用github搭建个人html网站

    前言:搭建个人网站早就想做了,最近有空就宅在家学习,突然发现github就可以搭建个人的纯html网站,于是开始了这项工作.转载请注明出处:https://www.cnblogs.com/yuxiao ...

  4. 获取本地内网和外网IP地址

    public class IPUtil { /// <summary> /// 获取本地内网IP /// </summary> /// <returns></ ...

  5. HDU1560(KB2-E IDA星)

    DNA sequence Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. redis安装以及php扩展

    启动安装:  http://elain.blog.51cto.com/3339379/705846 redis下载:  https://github.com/nicolasff/phpredis/do ...

  7. HTML5 MutationObserver检测页面劫持

    好久没写博客了,业务一直在变化,陆陆续续的做了很多web app,被业务流淹没就很少有机会去反思,前端技术发展如此之快,常常有种不学则退的恐慌,一种技术还没吃透就涌出新的技术,然后一波人又打着各种旗帜 ...

  8. cf623A. Graph and String(二分图 构造)

    题意 题目链接 Sol 可以这样考虑,在原图中没有边相连的点的值肯定是a / c 那么直接二分图染色即可 #include<bits/stdc++.h> #define LL long l ...

  9. cookie封装函数与使用方法(转)

    函数封装: var Cookie = function(name, value, options) { // 如果第二个参数存在 if (typeof value != 'undefined') { ...

  10. VMWare Workstation使用总结几则[转]

    VMWare Workstation使用总结几则   1.安装 使用GHOST盘安装时一定要注意,需要把空盘建立分区并设置为主分区 PQ的使用形式,进入PQ找到磁盘设置为启用 否则 启动后显示Boot ...