题意:给定N个数字,Q次询问,询问这个区间的最大加权众数是多少。 加权众数是指出现次数*数字大小。N,Q<1e5。

思路:不难发现可以N*sqrtN*logN的思路做,但是应该过不了。 这个Nsqrt是莫队的时间,log的支持加入和删除的数据结构的复杂度。 如果用配对堆的话,应该还是比较快的。 没有用办法去掉这个log呢。

回滚莫队:

排序:按照左端点所在块排序,如果左端点在同一块,则按照右端点大小排序。

分类处理:然后左端点在同一块的同时处理,(sqrt)次。我们维护一个num[],表示每个数字出现的次数。

1,对于他们的右端点,这些询问的右端点是单调递增的。所以每次直接右移即可。复杂度O(N)*sqrt;

2,但是左端点参差不齐,没关系,我们把他们的左端点都设置为L右边那一块的起点。  这样我们每次暴力处理左边部分加进去即可,更新答案后又还原。 这样就保证了只加不减,可以直接O(1)取最大了。O(sqrt)*M。

优点:保证了只加入元素,这样在诸如求“众数”,“mex”这一类题中不需要其他的数据结构。

当然,在求其他问题,比如区间逆序对时,我们的“回滚”好像鞭长莫及,这个时候可以用“二次离线莫队”来做。

#include<bits/stdc++.h>
#define int long long
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
struct in{
int L,R,bg,id;
}s[maxn];
bool cmp(in w,in v){
if(w.bg==v.bg) return w.R<v.R;
return w.L<v.L;
}
ll ans[maxn]; int a[maxn],b[maxn],num[maxn],tot,B,N,Q;
void bruteforce(int i)
{
rep(j,s[i].L,s[i].R){
num[a[j]]++;
ans[s[i].id]=max(ans[s[i].id],1LL*num[a[j]]*b[a[j]]);
}
rep(j,s[i].L,s[i].R) num[a[j]]--;
}
void solve(int l,int r)
{
int fcy=min(s[l].bg*B,N),now=fcy,mx=,tmp=;
while(l<=r&&s[l].R<=fcy) bruteforce(l++);
for(;l<=r;l++){
while(now<s[l].R) {
now++; num[a[now]]++;
mx=max(mx,1LL*num[a[now]]*b[a[now]]);
ans[s[l].id]=mx;
}
tmp=mx;
for(int j=fcy;j>=s[l].L;j--) {
num[a[j]]++;
tmp=max(tmp,1LL*num[a[j]]*b[a[j]]);
ans[s[l].id]=tmp;
}
for(int j=fcy;j>=s[l].L;j--) num[a[j]]--;
}
for(int i=fcy+;i<=now;i++) num[a[i]]=;
}
signed main()
{
scanf("%lld%lld",&N,&Q); B=sqrt(N+);
rep(i,,N) scanf("%lld",&a[i]),b[i]=a[i];
sort(b+,b+N+);
tot=unique(b+,b+N+)-(b+);
rep(i,,N) a[i]=lower_bound(b+,b+tot+,a[i])-b;
rep(i,,Q) {
scanf("%lld%lld",&s[i].L,&s[i].R);
s[i].id=i; s[i].bg=(s[i].L-)/B+;
}
sort(s+,s+Q+,cmp);
rep(i,,Q){
int j=i;
while(j+<=Q&&s[j+].bg==s[i].bg) j++;
solve(i,j);
i=j;
}
rep(i,,Q) printf("%lld\n",ans[i]);
return ;
}

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

  1. BZOJ4241:历史研究(回滚莫队)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 使用IDEA+vue.js+easyUI的demo

    最近,随便写了几个开发的小例子,自己总结下,留个纪念. 例子1:使用EasyUI做了一个简单界面,服务器和客户端在一起. @Controller @RequestMapping("/demo ...

  2. <a href="javascript:;">的用法说明

    <a href="javascript:;">的用法说明 1.标签的 href 属性用于指定超链接目标的 URL,href 属性的值可以是任何有效文档的相对或绝对 UR ...

  3. C#获取屏幕鼠标坐标点颜色

    [DllImport("user32.dll")]        private static extern IntPtr GetDC(IntPtr hwnd);          ...

  4. JS存取Cookies值

    这里对cookie进行了说明,也介绍了几个方法,但是我要取我存的cookie时取不到,他的方法只是针对存的  名字-值,不涉及键,所以自己写了个方法,来满足我的需求. 封装了简单存取Cookie: / ...

  5. 1+X”中级Web前端证书对应课程分析

    更多精彩内容欢迎访问我的个人博客皮皮猪:http://www.zhsh666.xyz或者http://www.zh66.club期待您的光临哦!我是皮皮猪,感谢各位光临,能为您排忧解难小站深感荣幸!祝 ...

  6. 了解jsp,这一篇就够了.

    jsp的执行过程: 1 客户端发出请求. 2 Web容器将JSP转译成Servlet源代码. 3 Web容器将产生的源代码进行编译. 4 Web容器加载编译后的代码并执行. 5 把执行结果响应至客户端 ...

  7. Larave框架下Contracts契约的解析

    本篇文章给大家带来的内容是关于Larave框架下Contracts契约的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Contracts Laravel 的契约是一组定义框架提 ...

  8. NodeJS添加Jquery依赖

    NodeJS使用时有时候需要JQuery依赖. 新版正确的依赖方式 var jsdom = require('jsdom'); const {JSDOM} = jsdom; const {docume ...

  9. HTML--元素居中各种处理方法2

    紧接上一篇. 如果要居中的是一个块元素呢. 1)如果你知道这个块元素的高度: <main> <div> I'm a block-level element with a fix ...

  10. 使用Ueditor上传图片到图片服务器(二)

    上一篇主要写了前端部分如何配置ueditor的上传路径,已经jsp页面中如何使用ueditor的编辑器功能以及如何配置单独的图片上传功能. 这一篇,我分两部分:第一部分是搭建图片服务器以及配置ftp上 ...