历史研究(洛谷AT_joisc2014_c 歴史の研究)

news/发布时间2024/5/19 16:09:44

历史研究(洛谷AT_joisc2014_c 歴史の研究)

题目描述

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

日记中记录了连续N天发生的事件,大约每天发生一件。

事件有种类之分。第i天发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大。

JOI 教授决定用如下的方法分析这些日记:

  • 选择日记中连续的几天[L,R]作为分析的时间段;

  • 定义事件A的重要度W为A*T,其中T为该事件在区间[L,R]中出现的次数。

现在,您需要帮助教授求出所有事件中重要度最大的事件是哪个,并输出其重要度

注意:教授有多组询问。

输入格式

第一行两个空格分隔的整数N和Q,表示日记一共记录了N天,询问有Q次。

接下来一行N个空格分隔的整数表示每天的事件种类。

接下来Q行,每行给出L,R表示一组询问。

输出格式

输出共有Q行,每行一个整数,表示对应的询问的答案。

样例

样例输入

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

样例输出

9
8
8
16
16

回滚莫队的复习

注意几个要点

  • 输入数据范围为1e9,但输入个数只有1e5,需用离散化预处理

  • 什么时候考虑回滚莫队:当add(或del)能方便处理而del(或add)不能方便处理时,考虑用回滚
    (这样回滚只用处理add(或del))

  • 输入时一定要初始化id

  • 回滚莫队的排序:先按查询的l所属的块升序排,再按查询的r升序排

  • l,r的初值设置一定要交叉(例如l=1,r=0),从而保证区间中的元素个数为0

  • 求解答案时如果l与r在同一块内,直接暴力求最值

  • 不在同一块内,先滚区间(把l和r滚到与问题区间相同),再采用回滚

  • 通过memcpy和设的变量来暂时存储数组和答案(为回滚做准备)

  • 每次求解答案时有关数组和变量都要清0
    (这里有一个小问题:用memset每次清空数组会T,但其实每次只需要把上一次用过的范围清空就好,时间复杂度要低点,我也不知道怎么证
    具体如下:

while (i<j&&q[i].r<=right)//在同一块内直接暴力 {ans=0;for (int k=q[i-1].l;k<=q[i-1].r;k++) ch[a[k]]=0;//memset(ch,0,sizeof(ch));--------会Tfor (int k=q[i].l;k<=q[i].r;k++) add(a[k]);h[q[i].id]=ans;i++;} 
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') {x=(x<<1)+(x<<3)+(c^48);c=getchar();}return x*f;
}
int sq,n,m,a[maxn],b[maxn],bl[maxn],l,r,ch[maxn],back[maxn];
ll ans,h[maxn];
struct pp{int l,r,id;
}q[maxn];
void dis()
{sort(b+1,b+1+n);int cnt=unique(b+1,b+1+n)-(b+1);for (int i=1;i<=n;i++){a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;bl[i]=(i-1)/sq+1;}
}
bool cmp(pp u,pp v)
{if (bl[u.l]!=bl[v.l]) return bl[u.l]<bl[v.l];return u.r<v.r;
}
void add(int x)
{ch[x]++;ans=max(ans,(ll)b[x]*ch[x]);
}
int main()
{n=read();m=read();for (int i=1;i<=n;i++) a[i]=b[i]=read();sq=sqrt(n);dis();//离散化 for (int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;sort(q+1,q+1+m,cmp);for (int i=1;i<=m;){int j=i;while (bl[q[j].l]==bl[q[i].l]&&j<=m) j++;int right=bl[q[i].l]*sq;while (i<j&&q[i].r<=right)//在同一块内直接暴力 {ans=0;for (int k=q[i-1].l;k<=q[i-1].r;k++) ch[a[k]]=0;for (int k=q[i].l;k<=q[i].r;k++) add(a[k]);h[q[i].id]=ans;i++;} r=right;l=right+1;//此时询问的r一定大于right,询问的l一定小于等于right ans=0;for (int k=q[i-1].l;k<=q[i-1].r;k++) ch[a[k]]=0; while (i<j){while (q[i].r>r) add(a[++r]);ll tmp=ans;memcpy(back,ch,sizeof(back));while (q[i].l<l) add(a[--l]);h[q[i].id]=ans;//回滚ans=tmp;l=right+1;memcpy(ch,back,sizeof(ch));i++;}}for (int i=1;i<=m;i++) printf("%lld\n",h[i]);return 0;} 

完结撒花!φ(゜▽゜*)♪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/20361737.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

02_Modbus的功能码与报文详解

Modbus协议类型 Modbus从站四张表类型 主站常用功能码 Modbus TCP请求报文,功能码03Modbus TCP应答报文,功能码03 00 17为23个字节:请求长度加应答长度06+17=23; 14为20长度:14+06=20Modbus UDP请求报文,功能码03Modbus UDP应答报文,功能码03 Modbus RTU请求报文,功能…

https加密机制

参考:https://www.cnblogs.com/sxiszero/p/11133747.html 对称加密:只用一个秘钥的加解密,如果秘钥进行了泄漏,导致数据不安全 非对称加密:非对称加密算法需要一组密钥对,分别是公钥和私钥,这两个密钥是成对出现的。公钥加密的内容需要对应的私钥解密,私钥加密的内容需…

Docker-DevOps-入门手册(全)

Docker DevOps 入门手册(全)原文:zh.annas-archive.org/md5/A074DB026A63DFD63D361454222593A5 译者:飞龙 协议:CC BY-NC-SA 4.0前言 Docker 与 DevOps 概述了容器化的强大力量以及这种创新对开发团队和一般运营的影响。我们还将了解 DevOps 的真正含义,涉及的原则,以及…

locust压测

目录locust1.依赖2. 实例2.1 压测方式2.2 locust服务端2.3 待压测接口服务3. 参考文档 locust 1.依赖 pip install locust2. 实例 2.1 压测方式 1. 压测方式 1.1 前台自编辑方式修改文件名为locustfile.py 并在控制台使用locust启动前台服务 用户自定义压测参数并开启压测1.2 …

linux系统CentOS下安装snmp服务

使用yum安装1.直接使用yum安装snmp*yum install -y net-snmp net-snmp-utils*2.可能碰到的报错3.按照提示安装依赖*yum install libmysqlclient.so.18* 4.要是还有报错,就按照提示执行*yum install -y net-snmp net-snmp-utils --skip-broken*5.其他安装好的上面是四个包,缺…

SQL

-一、名词 DB(DataBase):数据库 DBMS(DataBase Management System):数据库管理系统 SQL(Structured Query Language):一种操作关系型数据库的编程语言 二、安装: https://dev.mysql.com/downloads/windows/installer/8.0.html 选择MySQL Community Downloads -> M…