bzoj4241: 历史研究(回滚莫队)
这是一个叫做回滚莫队的神奇玩意儿
是询问,而且不强制在线,就决定是你了莫队
如果是每次插入一个数是不是很简单?
然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字
那么把它变成只插入不就行了么?
我们莫队将询问分块的时候,以左端点所在块为第一关键字,右端点(不是右端点所在块)为第二关键字
对于每一个询问,如果左右端点在同一块中,直接暴力处理,复杂度\(O(\sqrt{n})\)
如果不在同一个块中呢?我们把所有左端点在同一块中的一起处理,那么右端点就是单调增的,这一部分只有插入,暴力计算的复杂度是\(O(n)\)
可是左端点的走位很飘啊?我们可以每一次都把左端点移到这一块的最右端,然后让它不断左移,那么这一部分也变成只有插入了
于是总的复杂度为\(O(n\sqrt{n})\)
//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R ll x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5+5;
int n,m;ll ans[N],res;
int bl[N],cnt[N],b[N],a[N],tot,S;
struct node{
int l,r,id;
node(){}
node(R int l,R int r,R int id):l(l),r(r),id(id){}
inline bool operator <(const node &b)const{return bl[l]==bl[b.l]?r<b.r:bl[l]<bl[b.l];}
}q[N];
inline void add(R int x){++cnt[a[x]],cmax(res,1ll*cnt[a[x]]*b[a[x]]);}
ll solve(int l,int r){
static int cnt[N];ll res=0;
fp(i,l,r)cnt[a[i]]=0;
fp(i,l,r)++cnt[a[i]],cmax(res,1ll*cnt[a[i]]*b[a[i]]);
return res;
}
int calc(int i,int id){
int qr=min(n,id*S),r=qr;res=0;
memset(cnt,0,sizeof(cnt));
for(;bl[q[i].l]==id;++i){
if(bl[q[i].l]==bl[q[i].r]){ans[q[i].id]=solve(q[i].l,q[i].r);continue;}
while(r<q[i].r)add(++r);
ll ret=res;
fp(k,q[i].l,qr)add(k);
ans[q[i].id]=res;
fp(k,q[i].l,qr)--cnt[a[k]];
res=ret;
}return i;
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read(),S=sqrt(n);
fp(i,1,n)a[i]=b[i]=read(),bl[i]=(i-1)/S+1;
sort(b+1,b+1+n),tot=unique(b+1,b+1+n)-b-1;
fp(i,1,n)a[i]=lower_bound(b+1,b+1+tot,a[i])-b;
fp(i,1,m)q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+1+m);
for(R int i=1,id=1;id<=bl[n];++id)i=calc(i,id);
fp(i,1,m)print(ans[i]);
return Ot(),0;
}
bzoj4241: 历史研究(回滚莫队)的更多相关文章
- BZOJ4241:历史研究(回滚莫队)
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- BZOJ4241历史研究——回滚莫队
题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连 ...
- bzoj4241/AT1219 历史研究(回滚莫队)
bzoj4241/AT1219 历史研究(回滚莫队) bzoj它爆炸了. luogu 题解时间 我怎么又在做水题. 就是区间带乘数权众数. 经典回滚莫队,一般对于延长区间简单而缩短区间难的莫队题可以考 ...
- BZOJ.4241.历史研究(回滚莫队 分块)
题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...
- 「JOISC 2014 Day1」历史研究 --- 回滚莫队
题目又臭又长,但其实题意很简单. 给出一个长度为\(N\)的序列与\(Q\)个询问,每个询问都对应原序列中的一个区间.对于每个查询的区间,设数\(X_{i}\)在此区间出现的次数为\(Sum_{X_{ ...
- 【题解】BZOJ4241: 历史研究(魔改莫队)
[题解]BZOJ4241: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究 ...
- AT1219 歴史の研究 回滚莫队
可在vj上提交:https://vjudge.net/problem/AtCoder-joisc2014_c 题意: IOI 国历史研究的第一人--JOI 教授,最近获得了一份被认为是古代 IOI 国 ...
- AT1219 歴史の研究[回滚莫队学习笔记]
回滚莫队例题. 这题的意思大概是 设 \(cnt_i\) 为 l ~ r 这个区间 \(i\) 出现的次数 求\(m\) 次询问 求 l~r 的 max {\(a_i\) * \(cnt_i\)} \ ...
- 【BZOJ4241】历史研究(回滚莫队)
题目: BZOJ4241 分析: 本校某些julao乱膜的时候发明了个"回滚邹队",大概意思就是某个姓邹的太菜了进不了省队回滚去文化课 回滚莫队裸题qwq(话说这个名字是不是莫队本 ...
- 2018.08.14 bzoj4241: 历史研究(回滚莫队)
传送们 简单的回滚莫队,调了半天发现排序的时候把m达成了n... 代码: #include<bits/stdc++.h> #define N 100005 #define ll long ...
随机推荐
- iss 默认上传大小为30 M
在 Windows7(iis7.5).Win2008(iis 7.0)和Win2003(iis 6.0) 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击.指 ...
- 201671010127 2016-2017-18 Java期末总结
通过本学期Java课程的学习,我对于面向对象的编程语言有了进一步的了解.首先面向对象编程的特点是抽象.封装.继承.多态.由于已经学过c语言,所以对Java的学习实际上是从第四章对向与类开始的,然后学习 ...
- 服务器安装Ubuntu的那些坑
1. 虽然简体中文很亲切,但请选择English,否则极有可能安装途中报错 2. 安装完各种系统文件后,请注意选择启动Disk,一不小心跳过了貌似只好重装 3. 进入后无法使用apt-get,总提示需 ...
- NAT穿透的详细讲解及分析.RP
原创出处:https://bbs.pediy.com/thread-131961.htm 转载来源: https://blog.csdn.net/g_brightboy/article/details ...
- 浅谈css float
相信许多许多Web前端的朋友一定被float这个属性给困扰过吧,有时候用它来布局很方便,能够实现元素快速的水平排列,但有时候它又像一个精灵,让人无法琢磨透它方位.在网上也看了一些关于float的帖子, ...
- javascript和jquery比较
<h1>我的第一段 JavaScript</h1> <p>请输入数字.如果输入值不是数字,浏览器会弹出提示框.</p> <input id=&qu ...
- activiti监听器
activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业务非常的复杂,通常有如下一些场景: 1.activiti人员动态的分配. 2.当前任务节点完成的时候,指定需要指定下一个节点的处理人( ...
- Linux下MySQL表名不区分大小写的设置方法
MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大小写不一致造成的. mysql在window ...
- 异步IO类
也学习多线程一段时间了,也写了几个简单实用的功能类,也意思到细节的处理的重要性,现在就让我们来写一个稍稍更有用的异步IO的类. 本来想参考Java NIO 中的类,Java NIO作为新io包,本身提 ...
- CentOS 7安装GitLab、汉化、配置邮件发送
1.更换国内yum源 1.1 备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 1.2 ...