问题 C: 历史研究

时间限制: 1 Sec  内存限制: 128 MB
提交: 61  解决: 2
[提交] [状态] [命题人:admin]

题目描述

IOI 国历史研究的大牛——JOI 教授,最近获得了一份被认为是古代 IOI 国的住民写下的日记。JOI 教授为了通过这份日记来研究古代 IOI 国的生活,开始着手调查日记中记载的事件。
日记中记录了连续N天发生的事件,每天发生一件事件。
事件有种类之分。第i天发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大。
JOI 教授决定用如下的方法分析这些日记:
1.选择日记中连续的一些天作为分析的时间段;
2.事件种类t的重要度为t×(这段时间内重要度为t的事件数);
3.计算出所有事件种类的重要度,输出其中的最大值。
请制作一个帮助教授分析的程序,每次给出分析的区间,你需要输出重要度的最大值。

输入

第一行两个空格分隔的整数N和Q,表示日记一共记录了N天,询问有Q次。
接下来一行N个空格分隔的整数X1,...Xn,Xi表示第i天发生的事件的种类。
接下来Q行,第i行有两个空格分隔整数Ai和Bi,表示第i次询问的区间为[Ai,Bi]。

输出

输出Q行,第i行一个整数,表示第i次询问的最大重要度。

样例输入

复制样例数据

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

样例输出

9
8
8
16
16

提示


想着没啥思路就写莫队,然后一直变换着t和wa,最后发现自己缺个知识点、、、

回滚莫队,一开始没看懂,后来发现这东西还真是名副其实的在滚、、

考虑一般莫队,复杂度是,但是这题要求区间最值,那,要维护区间最值的话,

只能是再套个其他的数据结构,复杂度就变成了,没法再优化,

区间最值问题要维护只能是级别的

这时候我们注意到,如果区间一直扩张的话,最值其实可以取到,

但是如果区间在缩小的话,那就没办法了,所以,如何避免区间缩小这种情况呢

由分块的sort,想到,对于l在同一个块内的r,其实是不断递增的,

如果不考虑l的话,那再好不过了(l定住,r不断向右递增,所以区间是扩大的)

现在考虑怎么消除l的影响?

要是,要是l是每次递减的就好了,但是,很可惜,不是

怎么办、、、人为制造递减,,,

如果r在块外,l在块内,

例如

---|---L------|-----R-----

这样,r每次递增那就不管他和原来的莫队一样就行

l每次设置在下一块的开始位置,如下图

---|---L------|-----R-----

---|---L-----|^-----r-----

^是l的位置

这样每次l都是向块内移动的r每次都是向右移动的,就保证了区间的递增性

如果L和R都是在同一个块内怎么办,,

for暴力计算!!!!

观察l,每次移动到应该查询的位置(L),然后计算完答案后,再移动回去(下一块的开始位置)

这样,就是回滚莫队 了,可以明显看到l是滚来~滚去~的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
map<ll,int> vis;
int a[maxn],n,q,base;
int val[maxn],cnt[maxn],block[maxn];
struct node{int l,r,id;bool operator < (const node &b)const{return block[l]^block[b.l]?block[l]<block[b.l]:r<b.r;}
}Q[maxn];
ll out[maxn],ans;
ll Andrew(int l,int r,ll ans = 0){static int vis[maxn];for(int i=l;i<=r;i++)vis[a[i]] = 0;for(int i=l;i<=r;i++)vis[a[i]]++,ans = max(ans,1ll*vis[a[i]]*val[i]);return ans;
}
void Add(int x){cnt[a[x]]++;ans = max(ans,1ll*cnt[a[x]]*val[x]);
}
int main(){scanf("%d%d",&n,&q);base = sqrt(n);for(int i=1,cnt = 0;i<=n;i++){scanf("%d",&a[i]);val[i] = a[i];if(!vis.count(a[i])){vis[a[i]] = ++cnt;a[i] = vis[a[i]];}elsea[i] = vis[a[i]];block[i] = (i-1)/base+1;}for(int i=1;i<=q;i++)scanf("%d%d",&Q[i].l,&Q[i].r),Q[i].id = i;sort(Q+1,Q+1+q);int l = 1,r = 0;ll tans = 0;for(int i=1,id=1;i<=q;id++){int R = min(id*base+1,n),ql = R+1,qr = ql-1;ans = 0;memset(cnt,0,sizeof cnt);while(i<=q&&block[Q[i].l] == id){if(block[Q[i].l] == block[Q[i].r]){out[Q[i].id] = Andrew(Q[i].l,Q[i].r);i++;continue;}while(qr<Q[i].r)Add(++qr);//rll cur = ans;while(ql>Q[i].l)Add(--ql);//滚来~~out[Q[i].id] = ans;while(ql<R+1)cnt[a[ql]]--,ql++;//滚去、、ans = cur;i++;}}for(int i=1;i<=q;i++)printf("%lld\n",out[i]);return 0;
}

历史研究(回滚莫队)相关推荐

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

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

  2. AT1219-歴史の研究(历史研究)【回滚莫队】

    正题 题目链接:https://www.luogu.com.cn/problem/AT1219 题目大意 nnn个数字,mmm次询问一个区间内ti∗it_i*iti​∗i的最大值,tit_iti​即区 ...

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

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

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

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

  5. 【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)

    文章目录 问题引入 介绍莫队算法及其实现过程 时间复杂度 莫队算法适用范围 莫队奇偶优化 普通莫队:小B的询问 树上莫队:SP10707 COT2 - Count on a tree II 回滚莫队: ...

  6. 【洛谷P6072 [MdOI2020] Path】【回滚莫队+Trie】

    题意 给一棵 n n n个节点的树,边有边权.定义一条路径的权值为边权的异或和.找两条节点不相交的路径,使得这两条路径的权值和最大. n ≤ 30000 n\le 30000 n≤30000 分析 问 ...

  7. 2021牛客第五场 I.Interval Queries-回滚莫队

    如图:一道很裸的回滚莫队,注意加入的操作和回滚的操作就好了. #include <cstdio> #include <cstring> #include <string& ...

  8. git:历史版本回滚、重新回到最新版本及取消修改内容

    重新检出历史版本 场景:需要回到之前的版本,修改参数执行一下代码 查看历史版本号 git log -10 #查看最近10次commit的记录 检出历史版本 git checkout <版本号&g ...

  9. git idea 本地历史版本回滚_如何为IDEA项目创建GitHub存储库和本地Git存储库

    有几种方法可以使用IntelliJ IDEA来发布我们在GitHub上编写的代码.在此博客中,我们将介绍两种方法.第一个步骤是最快的一步,您可以在其中创建本地和远程存储库.第二种方法是多步骤,当您要为 ...

最新文章

  1. NLP分析技术的三个层面
  2. 微服务框架-Spring Cloud简介(一)
  3. python增量赋值是什么_python学习记录20190122_增量赋值
  4. vivox21升级鸿蒙,vivo X21i相机规格再升级,加持AI成又一拍照神器
  5. 【多线程高并发】深入浅出volatile关键字
  6. mysql基础知识整理_MYSQL基础知识整理
  7. [vue] 如何解决vue打包vendor过大的问题?
  8. 我的第一个*.SYS
  9. 【WordPress 建站教程】在 正文顶端或末尾插入固定的内容
  10. 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)
  11. 用Pylint规范化Python代码,附PyCharm配置
  12. 蓝队应对攻击的常用策略二
  13. Chrome浏览器如何完美实现截长屏幕
  14. 2020下半年软考 软件设计师通过感言
  15. 程序员都知道的二维码扫码登录的底层原理
  16. 纯平显示器_绿色计算:切换到液晶纯平显示器
  17. ligerui demo php,LigerUI的简单使用示例
  18. 互联网无插件直播流媒体服务器方案EasyNVR下载新的软件执行程序,出现“invalid license”字样是什么意思?
  19. 微信小程序点击按钮弹出弹窗_微信小程序自定义弹窗(可通用)
  20. java-php-net-python-社会公共常识科普网计算机毕业设计程序

热门文章

  1. 徐工汉云解析中小企业如何设备上云?
  2. 两个优惠券CSS样式
  3. 7s巡检管理系统是什么_基于微信的巡检系统7S巡检管理系统
  4. mysql导入sql文件、数据库时报错ERROR: ASCII ‘\0‘ appeared in the statement
  5. 不是封闭的类Java
  6. python qt gui与数据可视化编程 kindle_Kindle Python教程 电子书 – Python数据可视化编程实战 PDF...
  7. [Tushare+Python] AH股轮动策略基础
  8. 解决工作流:org.activiti.engine.ActivitiException: Unknown property used in expression: ${AAAAA}报错
  9. Vue音乐--排行榜页面02_抓取首页数据
  10. Springboot+Vue实现在线聊天(通用版)