附带权值的类区间众数问题?不是很好策啊

发现题目没有强制在线,而且也只有询问操作,那么可以考虑莫队

但是这里的莫队有一个很显著的特征,插入的时候很好维护答案,但是删除的时候不好回退

那么有没有什么办法可以让莫队避免删除呢,当然是有的,而且这可以解决一大类类似问题

考虑类似于一般莫队的分块操作,我们再排序时以左端点所在块为第一关键字,右端点为第二关键字

那么我们可以根据左端点所在块分别处理这些询问

首先如果左右端点在同一块内,那么很简单,直接暴力统计完了直接删光光就好了,这是\(O(\sqrt n)\)的

如果不是呢?由于此时的右端点是递增的,我们维护一个指针不停地往右边插入数即可,对于每一块的复杂度不会超过\(O(n)\),由于一共只有\(\sqrt n\)块,所以总体还是\(O(n\sqrt n)\)的

可是这个时候左端点只是在同一块里并不是不变的。但是这部分的长度最多也是\(\sqrt n\)啊,再不济和暴力一样做了在删了就好了吗,一共\(n\)个询问所以最多也是\(O(n\sqrt n)\)的

所以这样的话复杂度就被压到了\(O(n\sqrt n)\),顺便提一下这种神奇的莫队方法叫做回滚莫队,不过还是比较好理解的

CODE

#include<cstdio>
#include<cctype>
#include<cmath>
#include<cstring>
#include<algorithm>
#define RI register int
#define CI const int&
#define Tp template <typename T>
using namespace std;
typedef long long LL;
const int N=100005;
int blk[N]; struct ques
{
int l,r,id;
inline ques(CI L=0,CI R=0,CI Id=0)
{
l=L; r=R; id=Id;
}
inline friend bool operator <(const ques& A,const ques& B)
{
return blk[A.l]<blk[B.l]||(blk[A.l]==blk[B.l]&&A.r<B.r);
}
}q[N]; int n,m,a[N],rst[N],num,now,size,bkt[N],tbkt[N]; LL ans[N],ret;
class FileInputOutput
{
private:
static const int S=1<<21;
#define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,S,stdin),A==B)?EOF:*A++)
#define pc(ch) (Ftop<S?Fout[Ftop++]=ch:(fwrite(Fout,1,S,stdout),Fout[(Ftop=0)++]=ch))
char Fin[S],Fout[S],*A,*B; int pt[25],Ftop;
public:
Tp inline void read(T& x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));
}
Tp inline void write(T x)
{
if (!x) return (void)(pc('0'),pc('\n')); RI ptop=0;
while (x) pt[++ptop]=x%10,x/=10; while (ptop) pc(pt[ptop--]+48); pc('\n');
}
inline void Fend(void)
{
fwrite(Fout,1,Ftop,stdout);
}
#undef tc
#undef pc
}F;
inline int min(CI a,CI b)
{
return a<b?a:b;
}
Tp inline void maxer(T& x,const T& y)
{
if (y>x) x=y;
}
inline LL calc(CI l,CI r,LL ret=0)
{
RI i; for (i=l;i<=r;++i) tbkt[a[i]]=0; for (i=l;i<=r;++i)
++tbkt[a[i]],maxer(ret,1LL*tbkt[a[i]]*rst[a[i]]); return ret;
}
inline void add(CI now)
{
++bkt[a[now]]; maxer(ret,1LL*bkt[a[now]]*rst[a[now]]);
}
inline void solve(CI id)
{
int qr=min(id*size,n),pr=qr; RI i; memset(bkt,0,sizeof(bkt));
for (ret=0;blk[q[now].l]==id;++now)
{
if (blk[q[now].l]==blk[q[now].r]) { ans[q[now].id]=calc(q[now].l,q[now].r); continue; }
while (pr<q[now].r) add(++pr); LL t=ret; for (i=q[now].l;i<=qr;++i) add(i);
ans[q[now].id]=ret; for (i=q[now].l;i<=qr;++i) --bkt[a[i]]; ret=t;
}
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
RI i; for (F.read(n),F.read(m),i=1;i<=n;++i) F.read(a[i]),rst[i]=a[i];
sort(rst+1,rst+n+1); num=unique(rst+1,rst+n+1)-rst-1; size=(int)sqrt(n);
for (i=1;i<=n;++i) blk[i]=(i-1)/size+1,a[i]=lower_bound(rst+1,rst+num+1,a[i])-rst;
for (i=1;i<=m;++i) F.read(q[i].l),F.read(q[i].r),q[i].id=i;
for (sort(q+1,q+m+1),now=i=1;i<=blk[n];++i) solve(i);
for (i=1;i<=m;++i) F.write(ans[i]); return F.Fend(),0;
}

AT1219 歴史の研究的更多相关文章

  1. AT1219 歴史の研究 解题报告

    AT1219 歴史の研究 题意 给定一个长为\(n\)的序列\(\{a\}\),询问区间\(a*cnt_a\)的最大值,即某个值乘上出现次数 回退莫队板子 只右移右指针和左指针每次回到块结尾即可. C ...

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

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

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

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

  4. [JOISC2014]歴史の研究/[BZOJ4241]历史研究

    [JOISC2014]歴史の研究/[BZOJ4241]历史研究 题目大意: 一个长度为\(n(n\le10^5)\)的数列\(A(A_i\le10^9)\),定义一个元素对一个区间\([l,r]\)的 ...

  5. 题解 AT1219 【歴史の研究】

    莫队 简单分析:题面含有IOI(惊),可知此题是IOI(数字三角形)难度(逃). 思路:回滚莫队 当然很多人都是抱着学回滚莫队的目标来看这道题的,所以这里介绍一下回滚莫队. 1.按莫队的思路讲询问排序 ...

  6. 【AT1219】历史研究

    Problem Description \(IOI\)国历史研究的第一人--\(JOI\)教授,最近获得了一份被认为是古代\(IOI\)国的住民写下的日记.\(JOI\)教授为了通过这份日记来研究古代 ...

  7. 【日语】日语单词N3_N4_N5

    日语单词N3_N4_N5 单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. ...

  8. 日语单词N3_N4_N5

    单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. 挨拶(あいさつ):① 寒暄 ...

  9. N4复习考试总结

    一つ(ひとつ) 半分(はんぶん) 煙草(たばこ)を吸う(すう) 玄関(げんかん) ナイフ(刀)     財布(さいふ) 浅い(あさい) 薄い(うすい) 牛乳(ぎゅうにゅう) 皿(さら) 七日(なのか) ...

随机推荐

  1. Flutter 布局(三)- FittedBox、AspectRatio、ConstrainedBox详解

    本文主要介绍Flutter布局中的FittedBox.AspectRatio.ConstrainedBox,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. FittedBox Scale ...

  2. ExtJS中layout的12种布局风格

    总览 extjs的容器组件都可以设置它的显示风格,它的有效值有 1. absolute,2. accordion, 3. anchor, 4. border, 5. card, 6. column, ...

  3. spring4笔记----PropertyOverrideConfigureer 重写占位符配置器(图)

  4. sql视图显示数据不对应

    出现这样的原因是修改了表的结构,没有重新编译视图,这种情况出现的几率很少,并不是没有. 解决方法:重新编译一下该视图. 视图是一个虚表,是从一个或几个基本表(或视图)中导出的表,在系统的数据字典中仅存 ...

  5. shell 函数用法

    近期在学习shell编程方面的知识,写的不怎么好,请大家多多指点,下面给大家分享一下shell函数的用法. 我们为什么要用shell函数? 简单的说,函数的作用就是把程序多次调用相同的代码部分定义成一 ...

  6. spring拦截器(interceptor)简介

    1. 拦截器用途 (1)拦截未登录用户直接访问某些链接 (2)拦截日志信息 (3)拦截非法攻击,比如sql注入 2. 涉及jar.类 (1)spring-webmvc.jar (2)HandlerIn ...

  7. oracle- 数据表分区

    1. 表分区概念 分区表是将大表的数据分成称为分区的许多小的子集.倘若硬盘丢失了分区表,数据就无法按顺序读取和写入,导致无法操作. 2. 表分区分类 (1)范围分区 create table tabl ...

  8. 百度地图在web中的使用(一)

    百度地图在web中的使用(js) 背景:在公司做一个地理位置的自定义字段,需要用到地图来获取经纬度和地址,在这选择了百度地图 准备工作 注册百度地图开发者,创建应用获取key http://lbsyu ...

  9. 如何激活windows或office

    郑重承诺:该激活软件没有病毒,有任何侵害行为,找我QQ:122317653 Step one: 首先你需要安装KMS Auto Net激活器,但我们都知道一些杀毒软件都会将此类激活器警告成木马病毒,原 ...

  10. Java入门(五):控制流程

    在Java中,使用条件语句和循环结构确定控制流程,在本文中,主要包括块作用域.条件语句.循环结构.中断循环这四部分. 一.块作用域 块,也叫复合语句,是指由一对大括号括起来的若干条Java语句.块决定 ...