洛谷题目

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 歴史の研究的更多相关文章

  1. AT1219 歴史の研究 回滚莫队

    可在vj上提交:https://vjudge.net/problem/AtCoder-joisc2014_c 题意: IOI 国历史研究的第一人--JOI 教授,最近获得了一份被认为是古代 IOI 国 ...

  2. AT1219 歴史の研究[回滚莫队学习笔记]

    回滚莫队例题. 这题的意思大概是 设 \(cnt_i\) 为 l ~ r 这个区间 \(i\) 出现的次数 求\(m\) 次询问 求 l~r 的 max {\(a_i\) * \(cnt_i\)} \ ...

  3. bzoj4241/AT1219 历史研究(回滚莫队)

    bzoj4241/AT1219 历史研究(回滚莫队) bzoj它爆炸了. luogu 题解时间 我怎么又在做水题. 就是区间带乘数权众数. 经典回滚莫队,一般对于延长区间简单而缩短区间难的莫队题可以考 ...

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

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

  5. BZOJ.4241.历史研究(回滚莫队 分块)

    题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...

  6. 2018.08.14 bzoj4241: 历史研究(回滚莫队)

    传送们 简单的回滚莫队,调了半天发现排序的时候把m达成了n... 代码: #include<bits/stdc++.h> #define N 100005 #define ll long ...

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

    传送门 这是一个叫做回滚莫队的神奇玩意儿 是询问,而且不强制在线,就决定是你了莫队 如果是每次插入一个数是不是很简单? 然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字 那么把它变成只插入不就行了 ...

  8. 【BZOJ4241】历史研究(回滚莫队)

    题目: BZOJ4241 分析: 本校某些julao乱膜的时候发明了个"回滚邹队",大概意思就是某个姓邹的太菜了进不了省队回滚去文化课 回滚莫队裸题qwq(话说这个名字是不是莫队本 ...

  9. BZOJ4241:历史研究(回滚莫队)

    题意:给定N个数字,Q次询问,询问这个区间的最大加权众数是多少. 加权众数是指出现次数*数字大小.N,Q<1e5. 思路:不难发现可以N*sqrtN*logN的思路做,但是应该过不了. 这个Ns ...

  10. BZOJ4241 历史研究 【回滚莫队】

    题目描述:给出一个长度为\(n\)的数组,每次询问区间 \([l,r]\),求 \(\max\limits_{x}x*cnt_x\),其中 \(cnt_x\) 表示 \(x\) 在区间 \([l,r] ...

随机推荐

  1. 【Azure App Services】多次操作App Service伸缩实例遇见限制操作记录

    问题描述 多次操作App Services,进行实例数的变化.达到限制后遇见报错: 错误的具体描述为: { "status": "Failed", " ...

  2. 【Azure 微服务】Service fabric升级结构版本失败问题

    问题描述 Service fabric升级结构版本失败,Service Fabric的可靠性层是白银层,持久性层为青铜层,当把节点从6个直接在虚拟规模集(VMSS)中缩放成了3个.从而引起了Servi ...

  3. 协程的async使用

    async与launch一样都是开启一个协程,但是async会返回一个Deferred对象,该Deferred也是一个job async函数类似于 launch函数.它启动了一个单独的协程,这是一个轻 ...

  4. C++基本知识梳理

    一.命名空间 概念:命名空间是新定义的一个作用域,里面可以放函数,变量,定义类等,主要用来防止命名冲突. 实现:namespace关键字 命名空间名字{ 命名空间成员 } 注意点: 1.命名空间可以嵌 ...

  5. Java 线程通信的应用:经典例题:生产者/消费者问题

    1 package bytezero.threadcommunication; 2 3 /** 4 * 线程通信的应用:经典例题:生产者/消费者问题 5 * 6 * 7 * 8 * @author B ...

  6. Java 包装类的使用 + 小练习

    1 package com.bytezreo.ut; 2 3 import org.junit.Test; 4 5 /** 6 * 7 * @Description 包装类的使用 8 * @autho ...

  7. Redis之数据持久化小结

    一.概述 Redis作为内存型的数据库,虽然很快,依然有着很大的隐患,一旦服务器宕机重启,内存中数据还会存在吗? 很容易想到的一个方案是从后台数据恢复这些数据,如果数据量很小,这倒是一个可行的方案.但 ...

  8. 并发编程 --- CAS原子操作

    介绍 CAS(Compare And Swap) 是一种无锁算法的实现手段,中文名称为比较并交换.它由 CPU 的原子指令实现,可以在多线程环境下实现无锁的数据结构. 原理 CAS 的原理是:它会先比 ...

  9. matlab修改读取mat文件后的变量名

    代码如下: %% str1=load('CH1.mat'); val_names = fieldnames(str1); % 获取结构体后那个未知的变量名 data1 = getfield(str1, ...

  10. 公开的Webservice集锦

    备注:以下所有的来自 互联网,版权归原作者所有 股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webx ...