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

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

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

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

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

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

首先如果左右端点在同一块内,那么很简单,直接暴力统计完了直接删光光就好了,这是\(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. Simplest Python K-Way Merging Sort|最简单的Python k路归并排序

    想做这个好长时间了,因为有一篇Dreamworks的论文<Coherent Out-of-Core Point-Based Global Illumination>提到了这个,一直没时间做 ...

  2. 章节七、4-Sets

    一.set中不允许存在相同的元素 package ZangJie7; import java.util.ArrayList; import java.util.HashSet; import java ...

  3. (网页)JavaScript周末总结(一)

    本周学习的内容总结: 1. 2章在html中使用javascript. 2. 3章Javascript的基本概念. 3. 4章变量,作用域,内存问题. 1-1:2章以下内容: 1.包含javascri ...

  4. Docker EE 安装 on centos7

    本文演示如何在CentOS7上安装Docker EE. 1 安装方式 有两种方法可以 在Centos上安装和升级Docker企业版(Docker EE): YUM存储库:设置Docker存储库并从中安 ...

  5. Flask中使用cookie和session

    Flask中使用cookie和session 设置cookie from flask import Flask,Response app = Flask(__name__) @app.route('/ ...

  6. MC9SD64单片机快速入门 I/O寄存器

    I/O的使用 数据方向寄存器和数据寄存器的配置 I/O输入输出的使用: 数据方向寄存器与数据寄存器 寄存器的概念: 寄存器,是集成电路中非常重要的一种存储单元,通常由触发器组成.在集成电路设计中,寄存 ...

  7. Ubuntu下使用QQ/Wechat

    实验环境:Ubuntu 16.04桌面版root用户下 安装Docker 配置Docker的apt源 $ sudo apt-get install apt-transport-https ca-cer ...

  8. LeetCode算法题-Count Primes(Java实现)

    这是悦乐书的第190次更新,第193篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第49题(顺位题号是204).计算小于非负数n的素数的数量.例如: 输入:10 输出:4 ...

  9. spring cloud 微服务日志跟踪 sleuth logback elk 整合

    看过我之前的文章的就可以一步一步搭建起日志传输到搜索引擎 不知道的 看下之前的文章 (1) 记一次logback传输日志到logstash根据自定义设置动态创建ElasticSearch索引 (2)关 ...

  10. February 18th, 2018 Week 8th Sunday

    Don't cry for what is lost. Smile for what still remains. 别为失去的哭泣,为还留在你身边的一切微笑吧. I have been told th ...