首页 > 其他分享 >2523. 历史研究

2523. 历史研究

时间:2022-10-08 13:11:40浏览次数:63  
标签:历史 le 2523 nums 研究 res int 日记 define

题目链接

2523. 历史研究

IOI 国历史研究的第一人——JOI 教授,最近获得了一份被认为是古代 IOI 国的住民写下的日记。

JOI 教授为了通过这份日记来研究古代 IOI 国的生活,开始着手调查日记中记载的事件。

日记中记录了连续 \(N\) 天发生的时间,大约每天发生一件。

事件有种类之分。第 \(i\) 天 \((1 \le i \le N)\) 发生的事件的种类用一个整数 \(X_i\) 表示,\(X_i\) 越大,事件的规模就越大。

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

  1. 选择日记中连续的一些天作为分析的时间段
  2. 事件种类 \(t\) 的重要度为 \(t \times\) (这段时间内重要度为 \(t\) 的事件数)
  3. 计算出所有事件种类的重要度,输出其中的最大值

现在你被要求制作一个帮助教授分析的程序,每次给出分析的区间,你需要输出重要度的最大值。

输入格式

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

接下来一行 \(N\) 个空格分隔的整数 \(X_1…X_N\),\(X_i\) 表示第 \(i\) 天发生的事件的种类。

接下来 \(Q\) 行,第 \(i\) 行 \((1 \le i \le Q)\) 有两个空格分隔整数 \(A_i\) 和 \(B_i\),表示第 \(i\) 次询问的区间为 \([A_i,B_i]\)。

输出格式

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

数据范围

\(1 \le N \le 10^5\),
\(1 \le Q \le 10^5\),
\(1 \le X_i \le 10^9\)

输入样例:

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

输出样例:

9
8
8
16
16

解题思路

回滚莫队

排序方式同普通莫队,即将 \(l\) 分块,每块内 \(r\) 递增,每块长度为 \(\sqrt{n}\),每次操作都是一块一块操作,先暴力处理块内的询问,每次其复杂度为 \(\sqrt{n}\),然后处理块间的询问,由于一个块内的 \(r\) 指针递增,即处理询问时 \(r\) 指针递增,而 \(l\) 不定,但 \(l\) 指针始终在块内,所以处理 \(l\) 指针可以暴力

  • 时间复杂度:\(O(n\sqrt{n})\)

代码

// Problem: 历史研究
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/2525/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
//#define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=1e5+5;
int n,m,w[N],cnt[N],len;
LL ans[N];
vector<int> nums;
struct query
{
	int id,l,r;
}q[N];
int get(int x)
{
	return x/len;
}
void add(int x,LL &res)
{
	cnt[x]++;
	res=max(res,(LL)nums[x]*cnt[x]);
}
void del(int x)
{
	cnt[x]--;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>w[i],nums.pb(w[i]);
	sort(nums.begin(),nums.end());
	nums.erase(unique(nums.begin(),nums.end()),nums.end());
	for(int i=1;i<=n;i++)w[i]=lower_bound(nums.begin(),nums.end(),w[i])-nums.begin();
	len=sqrt(n);
	for(int i=1;i<=m;i++)
	{
		q[i].id=i;
		cin>>q[i].l>>q[i].r;
	}
	sort(q+1,q+1+m,[](const query &a,const query &b){
		int al=get(a.l),bl=get(b.l);
		if(al!=bl)return al<bl;
		return a.r<b.r;
	});
	for(int x=1;x<=m;)
	{
		int y=x;
		while(y<=m&&get(q[y].l)==get(q[x].l))y++;
		int right=get(q[x].l)*len+len-1;
		while(x<y&&q[x].r<=right)
		{
			int l=q[x].l,r=q[x].r,id=q[x].id;
			LL res=0;
			for(int i=l;i<=r;i++)add(w[i],res);
			ans[id]=res;
			for(int i=l;i<=r;i++)del(w[i]);
			x++;
		}
		LL res=0;
		int i=right,j=right+1;
		while(x<y)
		{
			int l=q[x].l,r=q[x].r,id=q[x].id;
			while(i<r)add(w[++i],res);
			LL backup=res;
			while(j>l)add(w[--j],res);
			ans[id]=res;
			while(j<right+1)del(w[j++]);
			res=backup;
			x++;
		}
		memset(cnt,0,sizeof cnt);
	}
	for(int i=1;i<=m;i++)cout<<ans[i]<<'\n';
    return 0;
}

标签:历史,le,2523,nums,研究,res,int,日记,define
From: https://www.cnblogs.com/zyyun/p/16768619.html

相关文章

  • 从 C# 崩溃异常 中研究页堆布局
    一:背景1.讲故事最近遇到一位朋友的程序崩溃,发现崩溃点在富编辑器​​msftedit​​​上,这个不是重点,重点在于发现他已经开启了​​页堆​​,看样子是做了最后的挣扎。0:00......
  • 研究院-H3C10504_IRF及端口规划
    一、前言1.1背景 设计院需将两台汇聚交换机H3C10504做IRF虚拟化。二、端口规划   三、IRF配置3.1独立模式下配置IRF a、配置成员编号--在独立模式下必......
  • 科目二考试倒车入库的数学原理研究
     驾校教练一般不懂数学和物理学,如果问教练倒车入库的原理,脾气不好的教练可能会当场发飙,脾气好的教练可能会得抑郁症。为了不麻烦教练,本人亲自研究了一下倒车入库的物理......
  • 如何选到一位靠谱的研究生导师
    有师弟在知乎找到我、和我咨询一下选导师的事情因此、突发奇想、产出、总结了本篇博文敬请查阅????早起的鸟儿有虫吃不同阶段的同学,选到一位好导师、一位适合自己的导师的......
  • [答疑]历史状态指向别的状态有什么用,没有历史是不是应该回到初始状态
    ​​DDD领域驱动设计批评-文集-点击查看>>​​​​《软件方法》强化自测题集-点击查看>>​​(匿)2022-4-1112:36课后复习已三刷,觉得已经理解老师的讲解,可以提问了这道题根据......
  • Facebook AI何恺明又一新作 | 研究MoCo(动量对比学习),超越Hinton的SimCLR,刷新SOTA准确
    扫码关注我们公众号 :计算机视觉战队扫码回复:无监督,获取下载链接经常闲逛何老师主页,应该有所察觉,FacebookAI的何恺明老师有来一个新作,这次更加猛烈,远远比Hinton老师的Sim......
  • 报告分享|中国手术机器人行业研究报告
     报告链接:http://tecdat.cn/?p=28767当前,我国是全球第三大手术机器人市场,弗若斯特沙利文报告数据显示,2020年我国手术机器人市场规模全球占比5.1%;前两大市场分别是美国和......
  • 报告分享|2022年中国口腔医疗行业发展趋势研究报告
     报告链接:http://tecdat.cn/?p=28769 2022年《中国口腔医疗行业发展趋势研究报告》国家重视口腔卫生事业,2019年1月31日,国家卫健委发布《健康口腔行动方案(2019-2025年)》......
  • 从 C# 崩溃异常 中研究页堆布局
    一:背景1.讲故事最近遇到一位朋友的程序崩溃,发现崩溃点在富编辑器msftedit上,这个不是重点,重点在于发现他已经开启了页堆,看样子是做了最后的挣扎。0:000>!analyze-......
  • 近期人脸对齐的实证性研究
    本次推送参考文献《AnEmpiricalStudyofRecentFaceAlignmentMethods》人脸对齐方法的发展具有以下5个里程碑的阶段:1、1995年Cootes的ASM算法;2、1998年Cootes的AAM......