首页 > 其他分享 >CF1862G The Great Equalizer

CF1862G The Great Equalizer

时间:2023-08-27 10:45:58浏览次数:36  
标签:pr Equalizer Great 相邻 位置 CF1862G 修改 数组 排序

思路

对于一个数组,每次操作会缩短排序后的数组的相邻两个数的差距,所以总共会执行 \(k\) 次操作,其中,\(k\) 为排序后的数组的相邻两个数的最大差距。

因为每次操作都会对最大数加 \(1\),所以答案就是 \(\text{数组中的最大数} + \text{排序后的数组的相邻两个数的最大差距}\)。

因为修改操作修改的位置是按照原数组的位置而定的,所以如果每次修改操作都排序一遍的话,还需要在修改前再排一遍排回去,所以时间复杂度很高,必定会 TLE。

TLE code

#include<bits/stdc++.h>
using namespace std;
struct node{long long v,id;}a[200005];
inline bool cmp(node a,node b){return a.v<b.v;}
inline bool cmp1(node a,node b){return a.id<b.id;}
long long T,n,q,x,b;
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld",&n);
		for(int i=1;i<=n;++i) scanf("%lld",&a[i].v),a[i].id=i;
		scanf("%lld",&q);
		while(q--)
		{
			sort(a+1,a+n+1,cmp1);
			scanf("%lld%lld",&x,&b),a[x].v=b;
			sort(a+1,a+n+1,cmp);long long maxn=0;
			for(long long i=1;i<n;++i) maxn=max(maxn,a[i+1].v-a[i].v);
			printf("%lld ",a[n].v+maxn);
		}
		puts("");
	}
}

我们假设修改的位置是 \(p\),排序后这个位置的前一个位置是 \(pr\),后一个位置是 \(ne\)。

那么,相邻两数的差就最多更改两个地方,比如:原本的 \(a[p]-a[pr]\) 与 \(a[ne]-a[p]\) 会合并为 \(a[ne]-a[pr]\),同样会更改的地方还有改后的位置前后。

所以,我们可以考虑维护两个 \(\operatorname{multiset}\) 即可以出现重复元素的集合。

一个集合用于储存 \(a\) 数组,一个集合用于储存排序后相邻元素的差值。

然后用迭代器快速修改和查询,注意特殊情况的判断。

注:如果真的不是没有更好的方法,慎用迭代器。

AC code

#include<bits/stdc++.h>
using namespace std;
int T,n,a[200005],q,p,v;
multiset<int>s,c;
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;++i) scanf("%d",&a[i]);
		if(n==1)//特判特殊情况
		{
			scanf("%d",&q);
			while(q--) scanf("%d%d",&p,&v),printf("%d ",v);
			puts("");
		}
		else
		{
			s.clear(),c.clear();//记得清空
			for(int i=1;i<=n;++i) s.insert(a[i]);
			for(auto i=++s.begin();i!=s.end();++i)
			{
				auto pr=i;
				--pr;
				c.insert(*i-*pr);
			}
			scanf("%d",&q);
			while(q--)
			{
				scanf("%d%d",&p,&v);
				auto i=s.find(a[p]),ne=i,pr=i;++ne,--pr;//找到对应位置以及位置前后
				if(i==s.begin()) c.erase(c.find(*ne-*i));//如果在最前面,只用删除位置后一段的差值
				else if(i==--s.end()) c.erase(c.find(*i-*pr));//如果在最后面,只用删除位置前一段的差值
				else c.erase(c.find(*ne-*i)),c.erase(c.find(*i-*pr)),c.insert(*ne-*pr);//否则,合并位置前后的差值
				s.erase(i),s.insert(v),i=s.find(v),ne=i,pr=i;++ne,--pr;//修改集合s,顺便找到对应位置及位置前后
				if(i==s.begin()) c.insert(*ne-*i);//如果在最前面,只用添加位置后的差值
				else if(i==--s.end()) c.insert(*i-*pr);//如果在最后面,只用添加位置前的差值
				else c.insert(*ne-*i),c.insert(*i-*pr),c.erase(c.find(*ne-*pr));//否则,拆开位置前后的差值
				a[p]=v;//记得修改原数组
				printf("%d ",*--s.end()+*--c.end());//数组最大值+差值最大值
			}
			puts("");
		}
	}
	return 0;
}
//使用迭代器会变得不幸!调了快一天了,最后还是和官方题解找不同调好的。

标签:pr,Equalizer,Great,相邻,位置,CF1862G,修改,数组,排序
From: https://www.cnblogs.com/One-JuRuo/p/17659963.html

相关文章

  • G. The Great Equalizer
    G.TheGreatEqualizerTemaboughtanolddevicewithasmallscreenandaworn-outinscription"TheGreatEqualizer"ontheside.Thesellersaidthatthedeviceneedstobegivenanarray$a$ofintegersasinput,afterwhich"TheGreatE......
  • 活动 | 塑造软件新生态 赋能发展新变革——GreatSQL 受邀2023国际软博会
    塑造软件新生态,赋能发展新变革。8月31日-9月2日,第二十五届中国国际软件博览会将于天津梅江会展中心召开。本届软博会由中国电子信息行业联合会主办,聚焦全球软件前沿技术与产业发展方向,充分展示软件赋能数字经济、信息技术应用创新、工业互联网平台、智能制造及元宇宙等多领域发展......
  • 活动 | 塑造软件新生态 赋能发展新变革——GreatSQL 受邀2023国际软博会
    塑造软件新生态,赋能发展新变革。8月31日-9月2日,第二十五届中国国际软件博览会将于天津梅江会展中心召开。本届软博会由中国电子信息行业联合会主办,聚焦全球软件前沿技术与产业发展方向,充分展示软件赋能数字经济、信息技术应用创新、工业互联网平台、智能制造及元宇宙等多领域发展......
  • 探索GreatADM:图形化部署MGR的全新体验
    摘要:在DBA的日常工作中,快速部署数据库高可用架构,且标准化地入网部署数据库是一项重要的基础任务。本文将介绍常见的部署MGR的方式,并重点介绍万里数据库的GreatADM数据库管理平台进行图形化、可视化、标准化的部署过程,以提高交付效率和质量,给DBA提供一种全新的体验。(本文阅读大约......
  • Great Cow Gathering G
    GreatCowGatheringG思路换根dp,TreeDistancesI强化版,同样的先思考单个的,那么对于子树\(u\)对于每一个儿子\(v\)都有:\(f_u=f_v+sum_v*w_{u,v}\)其中\(sum\)是子树大小,而\(w\)则是边的长度,用这种方式可以求出以1为根的答案,然后考虑换根公式,首先要转移到的节点......
  • 图文结合丨带你轻松玩转MySQL Shell for GreatSQL
    一、引言1.1什么是MySQLShell?MySQLShell是MySQL的一个高级客户端和代码编辑器,是第二代MySQL客户端。第一代MySQL客户端即我们常用的MySQL。除了提供类似于MySQL的SQL功能外,MySQLShell还提供JavaScript和Python脚本功能,并包括与MySQL一起使用的API。......
  • GreatSQL从单机到MGR扩展纪实
    一、前言原有的业务系统跑在MySQL主从架构中,高可用通过脚本完成,但存在切换数据丢失和切换不及时风险,调研了高可用更稳定的MGR后,准备入手一试。本篇文章主要记录GreatSQL从单机扩展到MGR的详细过程,遇到的问题及解决方法。二、基础环境服务器角色如下IP端口主机名作用......
  • 数据质量管理工具预研——Griffin VS Deequ VS Great expectations VS Qualitis
    开源数据质量管理工具预研——GriffinVSDeequVSGreatexpectationsVSQualitis。概述 数据质量监控(DQC)是最近很火的一个话题,也是数据治理中最重要的一环。有一句话说得好。数据质量未必是数据治理中最重要的一部分,但是数据质量可能是让数据治理工作全部崩盘的第一步。所以......
  • GreatSQL通过错误日志信息判断数据库实例是如何关闭的
    背景概述在一次客户的数据库实例连接不上了,需要我们排查一下原因,通过查看数据库实例进程已经不存在了,在错误日志中没有发现其他报错信息,发现有shutdown的字样出现,怀疑是某个用户手动关闭了实例。我们通过以下测试,发现是由于用户关闭了主机所导致的。问题复现本次测试基于GreatS......
  • is greater than this module's compileSdkVersion (android-32). Dependency: an
    实现"isgreaterthanthismodule'scompileSdkVersion(android-32)"的步骤为了解决这个问题,我们需要按照以下步骤进行操作:步骤操作1确认项目的compileSdkVersion2更新项目的compileSdkVersion3更新相关依赖库的版本下面是每一步具体需要做的操作:步骤1......