题目描述

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

输入

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

输出

输出Q行,第i行(1<=i<=Q)一个整数,表示第i次询问的最大重要度

样例输入

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

样例输出

9
8
8
16
16

提示

1<=N<=10^5
1<=Q<=10^5
1<=Xi<=10^9 (1<=i<=N)
 
这道题要求的是最大值,显然不满足可减行,不能用普通莫队来解决。
在普通莫队排序时,是按照左端点所属块为第一关键字、右端点为第二关键字来排序的,那么我们将左端点属于同一块的询问一起处理。
对于左端点都属于同一块的询问,右端点排序后是单调递增的,所以对于这些询问中的每个询问,我们都固定左指针为下一块的第一个点不动,每次只移动右指针。
当右指针不动后,再将询问的左端点到左指针部分加入计算,得出这个询问的答案后再将这部分删掉。因为每次左指针移动都不大于$\sqrt{n}$,所以总时间复杂度还是$O(n\sqrt{n})$。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<bitset>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int block;
int n,m;
struct lty
{
int l,r,id;
}q[100010];
int a[200010];
int h[200010];
ll ans[100010];
ll cnt[200010];
ll res,mx;
int b[100010];
bool cmp(lty x,lty y)
{
return b[x.l]==b[y.l]?x.r<y.r:x.l<y.l;
}
int main()
{
scanf("%d%d",&n,&m);
block=sqrt(n);
for(int i=1;i<=n;i++)
{
b[i]=(i-1)/block+1;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
h[i]=a[i];
}
sort(h+1,h+1+n);
int num=unique(h+1,h+1+n)-h-1;
for(int i=1;i<=n;i++)
{
a[i]=lower_bound(h+1,h+1+num,a[i])-h;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+1,q+1+m,cmp);
int R=0,L=0;
for(int i=1;i<=m;i++)
{
if(b[q[i].l]!=L)
{
memset(cnt,0,sizeof(cnt));
R=(L=b[q[i].l])*block+1;
mx=cnt[a[R]]=h[a[R]];
}
if(b[q[i].l]==b[q[i].r])
{
cnt[a[R]]-=h[a[R]];
res=0;
for(int j=q[i].l;j<=q[i].r;j++)
{
res=max(res,cnt[a[j]]+=h[a[j]]);
}
ans[q[i].id]=res;
for(int j=q[i].l;j<=q[i].r;j++)
{
cnt[a[j]]-=h[a[j]];
}
cnt[a[R]]+=h[a[R]];
}
else
{
while(R<q[i].r)
{
++R;
mx=max(mx,cnt[a[R]]+=h[a[R]]);
}
ans[q[i].id]=mx;
for(int j=b[q[i].l]*block;j>=q[i].l;j--)
{
ans[q[i].id]=max(ans[q[i].id],cnt[a[j]]+=h[a[j]]);
}
for(int j=b[q[i].l]*block;j>=q[i].l;j--)
{
cnt[a[j]]-=h[a[j]];
}
}
}
for(int i=1;i<=m;i++)
{
printf("%lld\n",ans[i]);
}
}

BZOJ4241历史研究——回滚莫队的更多相关文章

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

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

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

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

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

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

  4. 「JOISC 2014 Day1」历史研究 --- 回滚莫队

    题目又臭又长,但其实题意很简单. 给出一个长度为\(N\)的序列与\(Q\)个询问,每个询问都对应原序列中的一个区间.对于每个查询的区间,设数\(X_{i}\)在此区间出现的次数为\(Sum_{X_{ ...

  5. 【题解】BZOJ4241: 历史研究(魔改莫队)

    [题解]BZOJ4241: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究 ...

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

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

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

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

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

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

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

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

随机推荐

  1. Vue利用canvas实现移动端手写板

    <template> <div class="hello"> <!--touchstart,touchmove,touchend,touchcance ...

  2. Zookeeper 分布式机器部署

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  3. 从.Net到Java学习第三篇——spring boot+mybatis+mysql

    从.Net到Java学习第一篇——开篇 环境:mysql5.7 新建mysql数据库demo,然后执行如下sql脚本进行数据表创建和数据初始化: -- ------------------------ ...

  4. C#中的yield return用法演示源码

    下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ...

  5. textarea 输入长度限制

    <textarea " placeholder="请输入详细地址(100字以内)"></textarea>

  6. 初使用maven遇到各种问题记录

    Cannot change version of project facet Dynamic Web Module to 2.5? 解决办法:将web.xml配置文件中的<web-app ver ...

  7. Xamarin 开发过的那些项目

    您可能已经看到类似的统计数据:智能手机用户在手机媒体上花费了89%的时间使用应用程序.或者听说Gartner预测到2017年移动应用程序下载将产生价值770亿美元的收入.很难不考虑这些数字.今天,每个 ...

  8. 使用mybatis操作AS400数据库

    先简单说一下怎么使用[jt400.jar]连接AS400上的DB2数据库. ※ jt400.jar资源,如果有安装AS400客户端的话,参考IBM官网 ※ http://www-01.ibm.com/ ...

  9. ThreadLocal的简单使用和实现原理

    我们先看以下代码,不用ThreadLocal会发生什么情况 package com.qjc.thread.threadLocal; import java.text.ParseException; i ...

  10. Loj 2320.「清华集训 2017」生成树计数

    Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...