题目连接

很显然可以想到分块,用f[i][j]表示块i到块j的ans,然后发现答案一定是f[i][j]

或者其他在边角出现的数字

我们在记下g[i][j]从开头到块i中的数字j出现的次数

这样就每一次就统计边角数字出现的次数,然后更新答案就好了

(好像莫对也可以做。。。。)

注意每一次查询时不要memset,会T飞

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
# include<cmath>
using namespace std;
typedef long long LL;
const int mn = 100005;
int n,m,siz;
int bl[mn],b[mn],c[mn],a[mn];
LL f[405][405];//块i到j的答案
int g[405][mn];//从1到块i中每个数出现的次数
int tmp[mn],st[mn],top;
void pre(int x)
{LL ans=0;memset(tmp,0,sizeof(tmp));for(int i=1;i<=n;i++)g[x][i]=g[x-1][i];int y=min(n,x*siz);for(int i=(x-1)*siz+1;i<=y;i++)g[x][a[i]]++;for(int i=(x-1)*siz+1;i<=n;i++){tmp[a[i]]++;if(1ll*b[a[i]]*tmp[a[i]]>ans) ans=1ll*b[a[i]]*tmp[a[i]];if(i%siz==0)f[x][i/siz]=ans;if(i==n)f[x][bl[n]]=ans;}
}
LL ask(int x,int y)
{LL ans=0;top=0;//memset(tmp,0,sizeof(tmp));if(bl[x]==bl[y]){for(int i=x;i<=y;i++){if(tmp[a[i]]==0) st[++top]=a[i];tmp[a[i]]++;if(1ll*b[a[i]]*tmp[a[i]]>ans) ans=1ll*b[a[i]]*tmp[a[i]];}for(int i=top;i>=1;i--)tmp[st[i]]=0;return ans;}else {if(bl[y]-1>=bl[x]+1) ans=f[bl[x]+1][bl[y]-1];for(int i=x;i<=bl[x]*siz;i++){if(tmp[a[i]]==0) st[++top]=a[i],tmp[a[i]]=g[bl[y]-1][a[i]]-g[bl[x]][a[i]];tmp[a[i]]++;if(1ll*b[a[i]]*tmp[a[i]]>ans) ans=1ll*b[a[i]]*tmp[a[i]];}for(int i=(bl[y]-1)*siz+1;i<=y;i++){if(tmp[a[i]]==0) st[++top]=a[i],tmp[a[i]]=g[bl[y]-1][a[i]]-g[bl[x]][a[i]];tmp[a[i]]++;if(1ll*b[a[i]]*tmp[a[i]]>ans) ans=1ll*b[a[i]]*tmp[a[i]];}for(int i=top;i>=1;i--)tmp[st[i]]=0;return ans;}
}
int main()
{//freopen("4241.in","r",stdin);//freopen("4241.out","w",stdout);int x,y;scanf("%d%d",&n,&m);siz=sqrt(n*1.0);for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];sort(b+1,b+1+n);for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+n,a[i])-b;/*for(int i=1;i<=n;i++)printf("%d ",a[i]);离散化*/for(int i=1;i<=n;i++)bl[i]=(i-1)/siz+1;for(int i=1;i<=bl[n];i++)pre(i);memset(tmp,0,sizeof(tmp));for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);printf("%lld\n",ask(x,y));}return 0;
}

转载于:https://www.cnblogs.com/logeadd/p/9586006.html

BZOJ4241历史研究题解相关推荐

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

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

  2. BZOJ4241 历史研究(莫队)

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

  3. 【练习】BZOJ4241: 历史研究(回滚莫队)

    题意 给定一个长度为 n n n的序列,并提出q" role="presentation">qqq个询问,每次询问要求回答区间 [l,r] [ l , r ] [l ...

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

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

  5. BZOJ 4241: 历史研究

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Pytorch+CNN+猫狗分类实战
  2. python的jupyter的使用教程-Python·Jupyter Notebook各种使用方法
  3. 白话Elasticsearch70-ES生产集群部署之production mode下启动时的bootstrap check
  4. 《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则
  5. 第十一届蓝桥杯大赛软件赛省赛 C/C++ 大学B组
  6. python pyyaml模块使用示例:读取yaml文件内容
  7. ffplay分析 (音视频同步:主时钟为音频)
  8. windows进入mysql
  9. 生产环境Nginx配置文件
  10. reactrouter4路由钩子_react router @4 和 vue路由 详解(八)vue路由守卫
  11. python画折线图虚线_python绘制简单折线图代码示例
  12. 定点补码加减法运算_计算机相关问题:谈谈我眼中的补码
  13. 【转】Prewitt 算子
  14. (日常搬砖) ubuntu18.04 向日葵卡死/软件界面卡死
  15. 达人管理系统(CRM)原型图
  16. php网络编程socket通讯
  17. 电路板级的EMC设计 (2)元件的选择和电路设计技术
  18. Ubuntu18.04.4安装
  19. 怎样让谷歌浏览器切换兼容模式打开网页
  20. /dev/random和/dev/urandom的一点备忘

热门文章

  1. 初接触RTMP流媒体实时消息传输协议
  2. Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net
  3. Android getReadableDatabase() 和 getWritableDatabase()
  4. 【234期门诊集锦】全面了解 VMware View 5 虚拟桌面
  5. ( 4 )MySQL中的数据类型(字符串类型)
  6. Sublime Text 3快捷键
  7. 基于CentOS构建高功能的LAMP平台
  8. vba 生成euc文件的方法
  9. java day34【ECMAScript 、BOM 、DOM 、事件】
  10. Jenkins+码云 搭建持续集成环境