#回滚莫队#AT1219 歴史の研究
分析
不满足区间减性质的运算,如最值,就不能用普通莫队求,
考虑回滚莫队,它的核心思想就是若区间在块内直接暴力,
否则将右端点从小到大排序,右端点按普通莫队求,那么左端点由于只在一个块内,
所以询问完跳到块末,由于块的大小为根号,影响复杂度的实际上是右端点,
然后每次处理完相同左端点块清除标记
代码
#include <cstdio>
#include <cctype>
#include <cmath>
#include <algorithm>
#define rr register
using namespace std;
const int N=100011; typedef long long lll;
struct rec{int l,r,rk;}q[N]; lll Ans[N];
int a[N],b[N],pos[N],c[N],m,tot,bl,n,cnt[N],cnT[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(lll ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
bool cmp(rec x,rec y){return (pos[x.l]^pos[y.l])?(pos[x.l]<pos[y.l]):(x.r<y.r);}
inline signed min(int a,int b){return a<b?a:b;}
inline lll max(lll a,lll b){return a>b?a:b;}
inline lll calc(int l,int r){
rr lll ans=0;
for (rr int i=l;i<=r;++i){
++cnT[a[i]];
ans=max(ans,1ll*cnT[a[i]]*b[a[i]]);
}
for (rr int i=l;i<=r;++i) --cnT[a[i]];
return ans;
}
signed main(){
n=iut(),m=iut(),bl=sqrt(n)+1;
for (rr int i=1;i<=n;++i) b[i]=a[i]=iut(),pos[i]=(i-1)/bl+1;
sort(b+1,b+1+n),tot=unique(b+1,b+1+n)-b-1;
for (rr int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+1+tot,a[i])-b;
for (rr int i=1;i<=m;++i) q[i]=(rec){iut(),iut(),i};
sort(q+1,q+1+m,cmp);
for (rr int L=1,R;L<=m;L=R+1){
rr int now=pos[q[L].l],Tot=0; rr lll ans=0;
rr int Ed=min(now*bl,n),l=Ed+1,r=Ed;
for (R=L;pos[q[R].l]==now;++R); --R;
for (rr int i=L;i<=R;++i)
if (now==pos[q[i].r]) Ans[q[i].rk]=calc(q[i].l,q[i].r);
else{
while (r<q[i].r){
++cnt[a[++r]],c[++Tot]=a[r];
ans=max(ans,1ll*cnt[a[r]]*b[a[r]]);
}
rr lll tmp=ans;
while (l>q[i].l)
++cnt[a[--l]],ans=max(ans,1ll*cnt[a[l]]*b[a[l]]);
Ans[q[i].rk]=ans,ans=tmp;
while (l<=Ed) --cnt[a[l++]];
}
for (rr int i=1;i<=Tot;++i) --cnt[c[i]];
}
for (rr int i=1;i<=m;++i)
print(Ans[i]),putchar(10);
return 0;
}
#回滚莫队#AT1219 歴史の研究的更多相关文章
- AT1219 歴史の研究 回滚莫队
可在vj上提交:https://vjudge.net/problem/AtCoder-joisc2014_c 题意: IOI 国历史研究的第一人--JOI 教授,最近获得了一份被认为是古代 IOI 国 ...
- AT1219 歴史の研究[回滚莫队学习笔记]
回滚莫队例题. 这题的意思大概是 设 \(cnt_i\) 为 l ~ r 这个区间 \(i\) 出现的次数 求\(m\) 次询问 求 l~r 的 max {\(a_i\) * \(cnt_i\)} \ ...
- bzoj4241/AT1219 历史研究(回滚莫队)
bzoj4241/AT1219 历史研究(回滚莫队) bzoj它爆炸了. luogu 题解时间 我怎么又在做水题. 就是区间带乘数权众数. 经典回滚莫队,一般对于延长区间简单而缩短区间难的莫队题可以考 ...
- BZOJ4241:历史研究(回滚莫队)
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- BZOJ.4241.历史研究(回滚莫队 分块)
题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...
- 2018.08.14 bzoj4241: 历史研究(回滚莫队)
传送们 简单的回滚莫队,调了半天发现排序的时候把m达成了n... 代码: #include<bits/stdc++.h> #define N 100005 #define ll long ...
- bzoj4241: 历史研究(回滚莫队)
传送门 这是一个叫做回滚莫队的神奇玩意儿 是询问,而且不强制在线,就决定是你了莫队 如果是每次插入一个数是不是很简单? 然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字 那么把它变成只插入不就行了 ...
- 【BZOJ4241】历史研究(回滚莫队)
题目: BZOJ4241 分析: 本校某些julao乱膜的时候发明了个"回滚邹队",大概意思就是某个姓邹的太菜了进不了省队回滚去文化课 回滚莫队裸题qwq(话说这个名字是不是莫队本 ...
- BZOJ4241:历史研究(回滚莫队)
题意:给定N个数字,Q次询问,询问这个区间的最大加权众数是多少. 加权众数是指出现次数*数字大小.N,Q<1e5. 思路:不难发现可以N*sqrtN*logN的思路做,但是应该过不了. 这个Ns ...
- BZOJ4241 历史研究 【回滚莫队】
题目描述:给出一个长度为\(n\)的数组,每次询问区间 \([l,r]\),求 \(\max\limits_{x}x*cnt_x\),其中 \(cnt_x\) 表示 \(x\) 在区间 \([l,r] ...
随机推荐
- 细聊ASP.NET Core WebAPI格式化程序
前言 我们在使用ASP.NET Core WebApi时它支持使用指定的输入和输出格式来交换数据.输入数据靠模型绑定的机制处理,输出数据则需要用格式化的方式进行处理.ASP.NET Core框架已经内 ...
- 海康摄像SDK开发笔记(一):海康威视网络摄像头SDK介绍与模块功能
前言 视频监控.人脸识别等应用中经常使用到摄像头,当前占据主流视频监控摄像头就是海康和大华两家,都可通过自家的sdk或者是onvif方式使用和控制摄像头. 本文章讲解海康的sdk方式. 海康 ...
- pycharm中自定义函数补全
在 PyCharm 中,你可以通过以下步骤实现这一目标: 打开 PyCharm,点击顶部菜单的 "File"(文件) -> "Settings"(设置). ...
- 重点:递归函数,数学模块,随机模块---day14
1.递归函数 自己调用自己的函数是递归函数 递:去 归:回 一去一回叫作递归 简单递归 def digui(n): print(n,'<==1==>') if n > 0: digu ...
- Android内存优化—内存优化总结
内存优化总结 内存问题 内存抖动:导致GC导致卡顿 内存泄漏:导致频繁GC,可用内存减少 内存溢出:导致OOM 工具排查 AS中的Profiler查看内存情况,是否锯齿状,是否持续上升 MAT排查 L ...
- npm-links - 查看项目依赖包 - vscode 插件
npm-links 依赖包相关快捷链接
- SelectZenEmpty 下拉框 支持 最大长度 超出... vue 组件
<template> <Select v-model="innerValue" :disabled="disabled" :clearable ...
- node开发命令行脚本 / commander
1. 脚本第一行添加 #!/usr/bin/env node // index.js #!/usr/bin/env node console.log('hello world') 2. package ...
- Rabbit算法:轻量高效的加密利器
Rabbit算法起源: Rabbit算法是由Martin Boesgaard和Mette Vesterager提出的一种流密码算法,其设计初衷是为了提供高性能和高度安全性的加密方案.Rabbit算法结 ...
- Kotlin/Java 读取Jar文件里的指定文件
原文地址:Kotlin/Java 读取Jar文件里的指定文件 | Stars-One的杂货小窝 jar包本质上也是压缩文件,下面给出如何读取jar包里某个文件的源码: val jarFile = Ja ...