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

5 5
9 8 7 8 9
1 2
3 4
4 4
1 4
2 4

Sample Output

9
8
8
16
16

HINT

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

  这道题刚开始时没有思路......后来发现好像和区间众数的方法有点像......

  好了,我们考虑如何做这道题。首先,我们可以把区间分块。然后,我们可以用$O(n \sqrt{n})$的复杂度求出$f_{i,j}$,表示取第$i$块到第$j$块中所有元素的答案。

  然后,我们考虑如何得到区间$[l,r]$的答案。如果$l$和$r$在同一块,那么显然扫一遍这个块就可以了。否则,我们可以先把$[l,r]$覆盖的完整的块的答案统计一下,再统计一下边角余料中答案最大的数。显然答案一定在这三者中。

  但是,统计边角余料的答案并不好做。于是,我们可以再来一个数组$cnt_{i,j}$,表示前$i$个块中第$j$号元素出现了多少次(注意先要离散化),然后我们就可以$O(1)$地统计完整的块中每种元素出现的个数了。取一下$\max$就可以了。

  下面是代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
 7 #define maxn 100010
 8 #define kuai 501
 9
10 using namespace std;
11 typedef long long llg;
12
13 int n,m,N,ln,L[kuai],R[kuai],cnt[kuai][maxn];
14 int a[maxn],b[maxn],lb,c[maxn],ci[maxn],be[maxn];
15 llg f[kuai][kuai],ans;
16
17 int getint(){
18     int w=0;bool q=0;
19     char c=getchar();
20     while((c>'9'||c<'0')&&c!='-') c=getchar();
21     if(c=='-') q=1,c=getchar();
22     while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
23     return q?-w:w;
24 }
25
26 int main(){
27     n=getint();m=getint();
28     for(int i=1;i<=n;i++) a[i]=b[i]=getint();
29     sort(b+1,b+n+1); lb=unique(b+1,b+n+1)-b-1;
30     for(int i=1;i<=n;i++){
31         int l=1,r=lb,mid;
32         while(l!=r){
33             mid=l+r>>1;
34             if(a[i]<=b[mid]) r=mid;
35             else l=mid+1;
36         }
37         c[i]=l;
38     }
39     N=sqrt(n); ln=n/N; if(n%N) ln++;
40     for(int i=1;i<ln;i++) L[i]=R[i-1]+1,R[i]=N*i;
41     L[ln]=R[ln-1]+1; R[ln]=n;
42     for(int i=1,r;i<=ln;i++){
43         ans=0; r=L[i]-1;
44         for(int j=L[i];j<=R[i];j++) cnt[i][c[j]]++,be[j]=i;
45         for(int j=1;j<=ln;j++){
46             while(r<R[j]){
47                 r++; ci[c[r]]++;
48                 ans=max(ans,(llg)(ci[c[r]])*(llg)a[r]);
49             }
50             f[i][j]=ans;
51         }
52         for(int j=1;j<=n;j++) cnt[i][j]+=cnt[i-1][j];
53         for(int j=1;j<=lb;j++) ci[j]=0;
54     }
55     while(m--){
56         int l=getint(),r=getint(); ans=0;
57         if(be[l]==be[r]){
58             for(int i=l;i<=r;i++)
59                 ans=max(ans,(llg)(++ci[c[i]])*(llg)a[i]);
60             for(int i=l;i<=r;i++) ci[c[i]]--;
61         }
62         else{
63             ans=f[be[l]+1][be[r]-1];
64             for(int i=l;i<=R[be[l]];i++)
65                 ans=max(ans,(llg)((++ci[c[i]])+cnt[be[r]-1][c[i]]-cnt[be[l]][c[i]])*(llg)a[i]);
66             for(int i=L[be[r]];i<=r;i++)
67                 ans=max(ans,(llg)((++ci[c[i]])+cnt[be[r]-1][c[i]]-cnt[be[l]][c[i]])*(llg)a[i]);
68             for(int i=l;i<=R[be[l]];i++) ci[c[i]]--;
69             for(int i=L[be[r]];i<=r;i++) ci[c[i]]--;
70         }
71         printf("%lld\n",ans);
72     }
73     return 0;
74 }

转载于:https://www.cnblogs.com/lcf-2000/p/5721562.html

BZOJ 4241 历史研究相关推荐

  1. BZOJ 4241: 历史研究

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

  2. 【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列

    文章目录 T1:单峰排列 题目 题解 code T2:历史研究 题目 题解 code T3:大魔法师 题目 题解 code 我可能这辈子都更不出来狂欢赛5了,先咕咕 T1:单峰排列 题目 一个n的全排 ...

  3. 亚洲的音乐史料及其历史研究状况

    一.亚洲音乐的史料及其性质 东西方音乐的历史记载,在其形态的表述中有着很大的差异.这种差异是由于音乐本身的性质与叙述音乐史料的性质的不同而形成的,实际上也是构成音乐史特征的重要依据.乐谱.传记.手稿等 ...

  4. 历史研究(回滚莫队)

    问题 C: 历史研究 时间限制: 1 Sec  内存限制: 128 MB 提交: 61  解决: 2 [提交] [状态] [命题人:admin] 题目描述 IOI 国历史研究的大牛--JOI 教授,最 ...

  5. 汤因比与《历史研究》

    英国著名历史学家阿诺德·汤因比及其鸿篇巨制<历史研究>早已为专业研究人员和广大历史爱好者所熟悉和景仰,但十二本的<历史研究>卷帙浩繁,常令众多心仪者望而却步.汤因比在去世前,根 ...

  6. AI成功破译古老未知语言,人工智能技术开辟历史研究新时代

    近年来,人工智能在各个领域取得了突飞猛进的发展,成为了当今社会讨论的热点.尽管有关其使用的争议不断,但AI技术在某些方面的作用已经不容忽视. 最近,以色列特拉维夫大学和阿里尔大学的研究者们联手研发了一 ...

  7. 远古历史研究的魅力与挑战

    正如考古学家伊恩·霍德(Ian Hodder)曾经指出的那样,当我们只有极少的资料分布点时,通常不会只有一个模型适用于它们.资料愈是匮乏,我们愈是难以在不同的备选项间做出甄别.我们无法直接肯定或否定一 ...

  8. 王幼军:拉普拉斯概率理论的历史研究

     拉普拉斯概率理论的历史研究 http://www.doc88.com/p-917707463935.html 绪论 一,研究的意义 从中国数学史研究的角度来说,拉普拉斯的概率理论的历史可以为我们 ...

  9. 国内研究者在关注着大家的哪些心理变化?横断历史研究介绍与趋势分析

    Hello,大家好 这里是壹脑云科研圈,我是莹~ 在之前的一篇文献介绍<1993至2016年医学生心理健康变迁的横断历史研究>中,我们简要介绍了一下横断历史研究的方法. 文献|劝人学医,& ...

  10. BZOJ4241历史研究题解--回滚莫队

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4241 分析 这题就是求区间权值乘以权值出现次数的最大值,一看莫队法块可搞,但仔细想想,莫 ...

最新文章

  1. 在CISCO交换机上配置SSH
  2. 学习笔记Flink(四)—— Flink基础API及核心数据结构
  3. Spring的jar包下载及目录详解
  4. 面试官问我:如何设计 QQ、微信等第三方账号登陆 ?
  5. 随手能做194个实验,不呆板,轻松撬动大智慧
  6. NGINX下配置CACHE-CONTROL
  7. python coding utf-8_【转】怎么在Python里使用UTF-8编码
  8. 限定位宽比较大小_自己之前买电脑整理的一些电脑知识,比较粗糙,仅供参考。...
  9. Codeforces 510 E. Fox And Dinner
  10. 数字钟实验报告stm32_单片机-电子时钟实验报告
  11. php mysql 简单留言板_php+mysql 最简单的留言板_PHP教程
  12. 一文搞定移动端适配!
  13. 安装JDK和tomcat
  14. 谁提供一个能用的ICHAT文字聊天室程序,急需
  15. 网页连接mysql教程_网页怎么连接到数据库?
  16. 【WhatsApp营销】如何设置欢迎消息?WhatsAppBusiness问候语示例
  17. 那些值得借鉴的的国外创意404错误页面设计
  18. python成都_Python抓取成都房价信息
  19. 10.自媒体文章管理
  20. python的self使用

热门文章

  1. Python之父:为什么操作符很有用?
  2. Scala 基础(7)—— 函数字面量和一等函数
  3. 【Python】python网络协议
  4. 解决:/bin/bash: mvn: 未找到命令
  5. Linux中下载,压缩,解压等命令
  6. Windows7与Window2008 64位IIS7上面配置操作Excel
  7. XML参考 :XmlReader 详解、实例(3)-- 读取XML节点和属性名称
  8. linux每日命令(20):find命令概览
  9. 因项目需要做——ubuntu16.04 双网卡绑定
  10. MySQL开启命令自动补全功能(auto-rehash)