BZOJ4241历史研究题解
题目连接
很显然可以想到分块,用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历史研究题解相关推荐
- BZOJ4241历史研究题解--回滚莫队
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4241 分析 这题就是求区间权值乘以权值出现次数的最大值,一看莫队法块可搞,但仔细想想,莫 ...
- BZOJ4241 历史研究(莫队)
如果分块的话与区间众数没有本质区别.这里考虑莫队. 显然莫队时的删除可以用堆维护,但多了一个log不太跑得过. 有一种叫回滚莫队的trick,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中 ...
- 【练习】BZOJ4241: 历史研究(回滚莫队)
题意 给定一个长度为 n n n的序列,并提出q" role="presentation">qqq个询问,每次询问要求回答区间 [l,r] [ l , r ] [l ...
- 【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列
文章目录 T1:单峰排列 题目 题解 code T2:历史研究 题目 题解 code T3:大魔法师 题目 题解 code 我可能这辈子都更不出来狂欢赛5了,先咕咕 T1:单峰排列 题目 一个n的全排 ...
- BZOJ 4241: 历史研究
Description IOI国历史研究的第一人--JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- 亚洲的音乐史料及其历史研究状况
一.亚洲音乐的史料及其性质 东西方音乐的历史记载,在其形态的表述中有着很大的差异.这种差异是由于音乐本身的性质与叙述音乐史料的性质的不同而形成的,实际上也是构成音乐史特征的重要依据.乐谱.传记.手稿等 ...
- 历史研究(回滚莫队)
问题 C: 历史研究 时间限制: 1 Sec 内存限制: 128 MB 提交: 61 解决: 2 [提交] [状态] [命题人:admin] 题目描述 IOI 国历史研究的大牛--JOI 教授,最 ...
- 汤因比与《历史研究》
英国著名历史学家阿诺德·汤因比及其鸿篇巨制<历史研究>早已为专业研究人员和广大历史爱好者所熟悉和景仰,但十二本的<历史研究>卷帙浩繁,常令众多心仪者望而却步.汤因比在去世前,根 ...
- AI成功破译古老未知语言,人工智能技术开辟历史研究新时代
近年来,人工智能在各个领域取得了突飞猛进的发展,成为了当今社会讨论的热点.尽管有关其使用的争议不断,但AI技术在某些方面的作用已经不容忽视. 最近,以色列特拉维夫大学和阿里尔大学的研究者们联手研发了一 ...
- 远古历史研究的魅力与挑战
正如考古学家伊恩·霍德(Ian Hodder)曾经指出的那样,当我们只有极少的资料分布点时,通常不会只有一个模型适用于它们.资料愈是匮乏,我们愈是难以在不同的备选项间做出甄别.我们无法直接肯定或否定一 ...
最新文章
- 一图理解腾讯本次组织结构重大变革的方向和目的
- input python_Python input 使用
- SpringAOP编程-传统基于JDK代理的AOP开发
- 突发!这个操作系统竟比macOS还火
- 最佳实践 | 腾讯HTAP数据库TBase助力某省核心IT架构升级
- vmware服务器系统配置ip地址,教程 - Vmware ESXi IP地址配置
- AsyncTask与Thread+Handler的区别、AsyncTask的使用
- linux桌面lxde 安装_在Ubuntu上,如何安装轻量的LXDE桌面
- 计算机工程信息学院严翔,《频频相见》严翔、严晓频、胡凌虹,交通社出品,有容书邦发行著【摘要 书评 在线阅读】-苏宁易购图书...
- 一对同居男女同一天的日记
- 数据库中1NF,2NF,3NF的判别
- pygame小游戏——中国地图拼图小游戏
- BIGEMAP APP导入/导出文件\照片(kml\shp\cad(dxf)\txt\excel)
- 阿里云服务器域名备案
- Mysql复制表结构、表数据以及修改主键
- [绍棠] Vue解决V-HTML指令潜在的XSS攻击(‘v-html‘ directive can lead to XSS attack.)
- python矩阵运算_python矩阵计算
- 蚂蚁金服是如何实现App端侧的极致体验的?
- 关于ads1255/6的基本使用
- ubuntu18 软件源替换成清华源