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


Sample Output


HINT

1<=N<=10^5
1<=Q<=10^5
1<=Xi<=10^9 (1<=i<=N)

Source

JOI 2013~2014 春季training合宿 竞技1 By PoPoQQQ

Solution

时限很仁慈,毕竟这题正解就是分块(~常数大的写法慢成狗)

对序列分块,离散化一下,用桶记录出现次数,用块做一个前缀和,再用块的数量的平方的时间跑一个o(x^2)的暴力rmq,就可以预处理所有的初值。

最后对每个询问还是一样的套路,整块的就不枚,直接调用,不完整块的就暴力求解(~你的程序怎么越来越丑(man)了)

//Kaiba_Seto 20170120
//orz cjkmao
#include <math.h>
#include <stdio.h>
#include <memory.h>
#include <algorithm>
#define MaxN 100010
#define MaxS 350
#define RG register
#define inline __inline__ __attribute__((always_inline))
#define L long long
#define dmin(a,b) ((a)<(b)?(a):(b))
#define dmax(a,b) ((a)>(b)?(a):(b)) namespace io{
#define MaxBuf 1<<22
#define _getc() ((S==T&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S==T))?0:*S++)
char B[MaxBuf],*S=B,*T=B;
template<class Type>inline void Rin(RG Type &x){
x=;RG int c=getchar();RG bool b=;
for(;c<||c>;c=getchar())
if(c==)b=;
for(;c>&&c<;c=getchar())
x=(x<<)+(x<<)+c-;
if(b)x=-x;
}
}; int n,_q,a[MaxN],_reflection[MaxN],block_size,block_cnt[MaxS][MaxN],belong[MaxN],lef[MaxS],rig[MaxS];
L block_rmq[MaxS][MaxS]; struct _pair{
int first,*second;
bool operator < (const _pair &other) const {
return first < other.first;
}
}c[MaxN]; inline L query(RG int x,RG int y){
static int tmp_tim[MaxN],tmp_cnt[MaxN],T=;
RG int _l=belong[x],_r=belong[y];
RG L res=block_rmq[_l+][_r-]; ++T;
if(_l == _r){
for(RG int i=x;i<=y;i++){
if(tmp_tim[a[i]] != T){
tmp_tim[a[i]]=T; tmp_cnt[a[i]]=;
}
++tmp_cnt[a[i]];
res=dmax(res,(L) _reflection[a[i]] * tmp_cnt[a[i]]);
}
return res;
}
for(RG int i=x;i<=:: rig[_l];i++){
if(tmp_tim[a[i]] != T){
tmp_tim[a[i]]=T; tmp_cnt[a[i]]=block_cnt[_r-][a[i]]-block_cnt[_l][a[i]];
}
++tmp_cnt[a[i]];
res=dmax(res,(L) _reflection[a[i]] * tmp_cnt[a[i]]);
}
for(RG int i=:: lef[_r];i<=y;i++){
if(tmp_tim[a[i]] != T){
tmp_tim[a[i]]=T; tmp_cnt[a[i]]=block_cnt[_r-][a[i]]-block_cnt[_l][a[i]];
}
++tmp_cnt[a[i]];
res=dmax(res,(L) _reflection[a[i]] * tmp_cnt[a[i]]);
}
return res;
} int main(){
io::Rin(n),io::Rin(_q);
block_size=static_cast<int>(sqrt(n)+1e-);
for(RG int i=;i<=n;i++)
io::Rin(c[i].first),c[i].second=&a[i];
std::sort(c+,c++n);
for(RG int i=,m=;i<=n;i++){
if(i== || c[i].first != c[i-].first)
_reflection[++m]=c[i].first;
*c[i].second=m;
}
for(RG int i=;i<=n;i++)
belong[i]=(i-)/block_size+;
for(RG int i=;i<=n;i++)
block_cnt[belong[i]][a[i]]++;
for(RG int i=;(i-)*block_size+<=n;i++)
lef[i]=(i-)*block_size+,rig[i]=dmin(i*block_size,n);
for(RG int i=;:: lef[i];i++)
for(RG int j=;j<=n;j++)
block_cnt[i][j]+=block_cnt[i-][j];
for(RG int i=;lef[i];i++){
static int tmp_cnt[MaxN]; RG L ans=0LL;
memset(tmp_cnt,,sizeof tmp_cnt);
for(RG int j=lef[i];j<=n;j++){
++tmp_cnt[a[j]];
ans=dmax(ans,(L) _reflection[a[j]] * tmp_cnt[a[j]]);
if(j == rig[belong[j]])
:: block_rmq[i][belong[j]]=ans;
}
}
while(_q--){
RG int x,y;
io::Rin(x),io::Rin(y);
printf("%lld\n",query(x,y));
}
fclose(stdin);
return ;
}

[bzoj4241][历史研究] (分块)的更多相关文章

  1. bzoj4241 历史研究——分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 就是分块,预处理出从第 i 块到 j 位置的答案,以及从第 i 块到最后位置间每个数出 ...

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

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

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

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

  4. 【BZOJ4241】历史研究 分块

    [BZOJ4241]历史研究 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开 ...

  5. BZOJ4241 历史研究

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

  6. BZOJ4241 历史研究 莫队 堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JO ...

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

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

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

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

  9. BZOJ4241 历史研究(莫队)

    如果分块的话与区间众数没有本质区别.这里考虑莫队. 显然莫队时的删除可以用堆维护,但多了一个log不太跑得过. 有一种叫回滚莫队的trick,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中 ...

随机推荐

  1. 在Chrome与火狐中,输入框input类型为number时,如何去除掉的自带的上下默认箭头

    如何移除input='number'时浏览器自带的上下箭头: CSS样式: /* 去除input[type=number]浏览器默认的icon显示 */ input::-webkit-outer-sp ...

  2. Linux学习笔记之Linux常用命令剖析-cat/chmod/cd

    1.cat:用于连接文件并打印到标准输出设备上.(使用权限:所有使用者) 语法格式:cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明: -n 或 ...

  3. python自动化测试学习笔记-6excel操作xlwt、xlrd、xlutils模块

    python中通过xlwt.xlrd和xlutils操作xls xlwt模块用于在内存中生成一个xls/xlsx对象,增加表格数据,并把内存中的xls对象保存为本地磁盘xls文件; xlrd模块用于把 ...

  4. Windows及Linux环境下Tomcat的JVM参数调优

    Windows环境: catalina.bat文件修改 set JAVA_OPTS=-server -Xms4096m -Xmx4096m -XX:PermSize=512m -XX:MaxPermS ...

  5. 使用mysqldump导出数据库(表)

    mysqldump用来备份数据库或在不同数据库之间迁移数据,mydqldump的备份内容包括用来创建表和装载表的SQL语句. 一.mysqldump使用方法 (1).备份单个数据库或数据库中的部分表, ...

  6. YumRepo Error: All mirror URLs are not using ftp, http[s] or file

    有台机器使用Yum的时候,报错如下: YumRepo Error: All mirror URLs are not using ftp, http[s] or file. Eg. $releaseve ...

  7. [书目20140824]触动人心:设计优秀的iPhone应用

    关于作者致谢译者序入门设计令人欣喜且易用的应用等下……先吸口气阅读本书不需要专业知识忠言一切从点击开始       我们是如何使用iPhone应用的行走中:一只手,一只眼睛,一直在抖动尽快搞定满满一箱 ...

  8. TCPClient、TCPListener的用法

    支持Http.Tcp和Udp的类组成了TCP/IP三层模型(请求响应层.应用协议层.传输层)的中间层-应用协议层,该层的类比位于最底层的Socket类提供了更高层次的抽象,它们封装 TCP 和 UDP ...

  9. 继承static的注意点

    继承static的注意点 singleton模式会使用 <?php class Auth { protected static $_instance = null; /** * 单用例入口 * ...

  10. 《CSS世界》学习笔记(一)

    <CSS世界>,张鑫旭著,人民邮电出版社,2017年12月第一版. 1.P9二维码链接文章的demo值得一看,可以实现有关“某些区域颜色始终保持一致”的效果. P9二维码所链接文章的一个d ...