Codeforces Round 967 (Div. 2)(A,B,C,D)

news2024/9/27 15:21:31

A Make All Equal

题意

给定一个序列,每次如果a[i]<=a[i+1]则可以删除这两个的任意一个,问找出使a中所有元素相等所需的最小删除次数


思路

最小的删除次数就是保留相同数字最多的那个数的删除次数,无论如何都可以保留这个数,因为假如是3334那么可以根据3和4把4删了,假如是3332那么可以根据2和第一个3把2删了

代码

#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
void solve()
{
	cin>>n;
	map<int,int>mp;
	int ma=0;
	_rep(i,1,n)cin>>m,mp[m]++,ma=max(ma,mp[m]);
	cout<<n-ma<<'\n';
	return ;
}

B:Generate Permutation

题意

已知有一个排列,两个打字机,一个从1位置开始向右一个从n位置开始向左,
现在可以打字了,每次打字只能从1开始按顺序,比如现在在x位置,那么当你在x选择是否打字(假设是第一次),如果是x位置就是1,
假设你用第一个打字机从1开始不断往右,走到后面又想在前面打字了,那么可以选择使用一个回车再把打字机重新指向1
现在问的是构造一个序列使得用第一个打字机和第二个打字机所使用的最少回车数相同,如果没有则输出-1
例如:3 1 2
那么用第一个打字机,第一个位置不打,然后第二个位置打1,第三个位置打2然后回车 然后第一个位置打3
那么用第二个打字机,第三个位置不打,然后第二个位置打1,第一个位置不打然后回车 然后第三个位置打2,第一个位置打3



思路

通过手玩可以发现偶数都不行,首先2不行然后枚举4的所有情况也不行,保险起见可以打表
然后奇数就是假设是7输出7 6 5 1 2 3 4,

代码

#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _pre(i,a,b) for(int i=(a);i>=(b);--i)
int n,m;
void solve()
{
	cin>>n;
	if(n%2==0)cout<<"-1\n";
	else 
	{
		_pre(i,n,(n+1)/2+1)cout<<i<<" ";
		_rep(i,1,(n+1)/2)cout<<i<<" ";
		cout<<'\n';
	}
	return ;
}

C:Guess The Tree

题意

交互题,只会给定一个树的大小,然后每一次都可以询问两个节点a,b,然后返回一个x,满足|d(a,x)-d(b,x)|最小,其中d为两点之间最短距离,如果有多个x满足,返回离a最近的x
要求:询问次数<=15n



思路

每次询问当然是返回a-b路径上的中间点,如果a-b(包括a,b)有偶数个点就返回满足条件的两个点中离a近的那个点

自己一开始的写法是每次询问为(1,2),(1,3),...(1,n)然后每一次询问(a,b),假设返回值不是a(代表a,b不相邻)那就递归处理(a,x),(x,b)
但是可能会这样的树1-2-3-4-5-6-7-...-1000,然后我每次询问的时候都会递归2*i-1次(i=2,3,...n)显然会超过规定询问次数,所以要经过各种优化才能过(比如,已经遍历过的点不用再递归遍历,然后已经询问过的组合(a,b)不用再询问)

最后捋了一下思路
一种稳定一点的写法就是,把这一棵树看作以1为根的有向树,虽然每个点出度不一,但是每个点只有一个父结点(除了1)
所以从这个角度出发,从1开始递归处理所有的(1,i),但是要注意一个点,那就是一次递归中遍历到的所有点其实都已经确定下来了
就比如假设是1-3-5-2-4,但是我询问的是(1,2),我在递归的过程中一定把3,5,2都标记为已确定,这样就可以避免重复查找(下一次递归(a,b)如果b是已经确定的那么就说明递归不用再继续下去了)
于是最差平均每个点询问次数也只有logn,于是可以完美解决这个题

代码

#include <map>
#include <set>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <time.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define pp pop_back()
#define int long long
#define laile cout<<"laile"<<endl
#define lowbit(x) ((x)&(-x))
#define double long double
#define sf(x) scanf("%lld",&x)
#define sff(x,y) scanf("%lld %lld",&x,&y)
#define sd(x) scanf("%Lf",&x)
#define sdd(x,y) scanf("%Lf %Lf",&x,&y)
#define _for(i,n) for(int i=0;i<(n);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _pre(i,a,b) for(int i=(a);i>=(b);--i)
#define all(x) (x).begin(), (x).end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const int N=1e6+10,INF=4e18;
int n,m;
bool st[N];
set<PII>v;
int ask(int a,int b)
{
	int x;
	printf("? %lld %lld\n",a,b);
	fflush(stdout);
	scanf("%lld",&x);
	return x;
}
void deal(int a,int b)
{
	int x=ask(a,b);
	if(x==a)
	{
		v.insert({a,b});
		st[b]=true;
		return;
	}
	else
	{
		if(!st[x])deal(a,x);
		if(!st[b])deal(x,b);
	}
	return;
}
void solve()
{
//	cin>>n;
	sf(n);
	v.clear();
	_rep(i,1,n)st[i]=false;
	_rep(i,2,n)
		if(!st[i])deal(1,i);
	printf("!");
	for(auto i:v)printf(" %lld %lld",i.fi,i.se);
	printf("\n");
	fflush(stdout);
	return ;
}
signed main()
{
//	IOS;
	int T=1;
	sf(T);
//	cin>>T;
	while(T--)
		solve();
	return 0;
}

D:Longest Max Min Subsequence

题意

给定一个序列,找一个最长的子序列使得子序列各个元素都不相同并且满足最后得到的这个子序列的奇数位都乘-1之后子序列的字典序最小

思路

首先这个子序列的值肯定是原序列中去重之后的所有值,那么现在就要考虑以什么顺序选这些值可以使这个子序列字典序最小

先不考虑奇数位​

按照贪心的思想,假如我此时所有的元素都可以选,那么为了使字典序最小,我肯定每次优先选最小的数,这样显然就可以了,但是本题中如果先选了后面更小的数,会导致前面某个的数字没选上但是后面又再也不会出现这个数字了,这样一定是错解

所以要是每次都能找到一个区间,这个区间里面可以任意选择某个数,那我就可以轻松每次找到区间的最小值

​​于是构建了一个next数组,每一个位置对应自己这个数字下一个位置出现的下标,如果没有的话就指向n+1,

第一次统计答案如下图

可以发现,我从左往右找到1的时候,发现此时位置上的1是最后一次出现的了,所以我这个1是必选的,那么前面的5 2就可以任意选择选或不选,现在发现此时5 2 1中最小值为1所以选1,并且接下来前三个数不会再选了,此时的答案序列为{1}

第二次如下图第二次右指针走到9的时候发现这个位置的9是最后一次出现的9,于是考虑7 9(9在这一轮最后必选),显然优先选最小值7,然后选9,此时的答案序列为{1,7,9}

第三次如下图:

PS:由于7已经选过所以不必考虑7

这一轮分析同上两次,这一轮先选2再选5所以此时的答案序列为{1,7,9,2,5}

第四次由于2已经选过,结束,所以最终答案为{1,7,9,2,5}

动态维护集合中的最小值我这里用了multiset,multiset从begin()开始到end()自然就是从小到大的,所以访问*s.begin()即可,并且可以支持删除某个元素

然后现在考虑奇数位置乘上-1,那么为了使字典序最小,轮到判断奇数位的时候显然要找最大值,multiset从rbegin()开始到rend()就是从大到小的,所以访问*s.rbegin()即可

multiset可以删除集合中某一个值的所有元素,这样可以避免重复选中某个数,时间复杂度O(mlogn)m为重复元素的数量

		auto range=s.equal_range(now);
		s.erase(range.first,range.second);

于是本题得解

代码

#include <map>
#include <set>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define pp pop_back()
#define int long long
#define laile cout<<"laile"<<endl
#define lowbit(x) ((x)&(-x))
#define double long double
#define sf(x) scanf("%lld",&x)
#define sff(x,y) scanf("%lld %lld",&x,&y)
#define sd(x) scanf("%Lf",&x)
#define sdd(x,y) scanf("%Lf %Lf",&x,&y)
#define _for(i,n) for(int i=0;i<(n);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _pre(i,a,b) for(int i=(a);i>=(b);--i)
#define all(x) (x).begin(), (x).end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const int N=1e6+10,INF=4e18;
int n,m;
int q[N],ne[N],now[N];
bool st[N];
void solve()
{
	multiset<int>s;
	bool bl=0;
	cin>>n;
	_rep(i,1,n)cin>>q[i],now[i]=n+1,st[i]=false;
	_pre(i,n,1)
	{
		ne[i]=now[q[i]];
		now[q[i]]=i;
	}
//	_rep(i,1,n)cout<<ne[i]<<" ";
//	cout<<endl;
	vector<int>res;
	int r=1,l=1;
	while(r<=n)
	{
		while(r<=n&&(ne[r]!=n+1||st[q[r]]))
		{
			if(!st[q[r]])s.insert(q[r]);
			r++;
		}
		if(r>n)break;
		s.insert(q[r]);
//		cout<<"s:";
//		for(auto i:s)cout<<i<<" ";
//		cout<<endl;
		int now;
		if(!bl)
		{
			auto t=s.rbegin();
			if(t!=s.rend())
				now=*t;
		}
		else
		{
			auto t=s.begin();
			if(t!=s.end())
				now=*t;
		}
//		cout<<"now="<<now<<endl;
		res.pb(now);
		auto range=s.equal_range(now);
		s.erase(range.first,range.second);
		while(l<r)
		{
			auto t=s.find(q[l]);
			if(t!=s.end())s.erase(t);
			if(q[l]==now)break;
			l++;
		}
		st[now]=true;
		bl=!bl;
	}
	cout<<(int)res.size()<<'\n';
	for(auto i:res)cout<<i<<" ";
	cout<<"\n";
	return ;
}
signed main()
{
	IOS;
	int T=1;
	cin>>T;
	while(T--)
		solve();
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习记录:js算法(二十六):回文链表

文章目录 回文链表我的思路网上思路 总结 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 图一 图二 示例 1&#xff1a;&#xff08;图一&#xff09; 输入&…

数仓工具—Hive语法之URL 函数

hive—语法—URL 函数 业务需求中,我们经常需要对用户的访问、用户的来源进行分析,用于支持运营和决策。例如我们经常对用户访问的页面进行统计分析,分析热门受访页面的Top10,观察大部分用户最喜欢的访问最多的页面等: 又或者我们需要分析不同搜索平台的用户来源分析,统…

SpringBoot开发——结合Thymeleaf模板整合HTML

文章目录 一、 Thymeleaf介绍二、Springboot整合thymeleaf模板1、实现步骤1)创建一个Springboot项目2) 创建application.yml文件3)创建HTML文件4)编写controller文件5)启动Spring Boot2、Thymeleaf常用语法赋值、拼接条件判断: if/unless循环URL三元运算switch基本对象内…

Java报错处理系列之:Unable to make protected void java.util.ResourceBundle.setParent

Java报错处理系列之&#xff1a;Internal error : Unable to make protected void java.util.ResourceBundle.setParent accessible: module java.base does not "opens java.util" to unnamed module 7f1302d6 一、完整报错二、报错原因三、解决方法四、更多报错解决…

KMP 详解

KMP数组存的是什么 对于一个字符串 b,下标从1开始。 则kmp[i]表示 以i结尾的连续子串 s的前缀的最大值&#xff08;等价于前缀最大结尾处&#xff09; 如何求KMP 假设 i 以前的KMP都被求出来了。 j 表示上一个字符可以成功匹配的长度&#xff08;等价于下标&#xff09; …

TikTok Live与跨境电商的深度融合:直播带货引领品牌出海

在TikTok Live的应用中&#xff0c;品牌能够利用这一互动性极强的功能开辟新的销售渠道&#xff0c;推动全球业务的增长。本文Nox聚星将和大家探讨TikTok Live如何与跨境电商相结合&#xff0c;分析其应用场景。 一、TikTok Live与跨境电商的结合优势 庞大的用户基础&#xff…

众趣科技:实景三维和空间计算正走向行业深处

近日&#xff0c;众趣科技受邀出席了由中关村云计算产业联盟组织召开的“应用场景 x 数据要素”专题系列闭门研讨会&#xff0c;就空间计算和低空实景三维发展现状&#xff0c;众趣科技 VP 邰方程做了题为《空间计算和低空经济》的主题演讲。 1、《黑神话&#xff1a;悟空》空…

Qt/C++百度地图/高德地图/天地图/腾讯地图/谷歌地图/加载绘图工具栏

一、前言说明 在地图中提供一个绘图工具栏&#xff0c;可以便捷的在地图上添加各种覆盖物&#xff0c;比如折线、多边形、矩形、圆形等&#xff0c;然后可以获取这些覆盖物的路径以及中心点等属性。这里有几个小插曲&#xff0c;比如百度地图gl版本默认不提供这个功能&#xf…

FPGA没有老师带,光有项目支撑可以吗?

当然可以&#xff0c;自学能力强就行&#xff0c; 有项目支撑学起来比较快&#xff0c;也比较好掌握&#xff0c;但没有老师解答问题就比较费时间&#xff0c;而且得自己找教程学基础&#xff0c;要不然就是两眼抹黑了。 没人带就非常考验你自学能力&#xff0c;和控制力了&a…

2024高教社杯全国大学生数学建模竞赛C题原创python代码

2024高教社杯全国大学生数学建模竞赛C题原创python代码 C题题目&#xff1a;农作物的种植策略 思路可以参考我主页之前的文章 以下均为python代码&#xff0c;推荐用anaconda中的notebook当作编译环境 from gurobipy import Model import pandas as pd import gurobipy as g…

微信小程序知识点(二)

1.下拉刷新事件 如果页面需要下拉刷新功能&#xff0c;则在页面对应的json配置文件中&#xff0c;将enablePullDownRefresh配置设置为true&#xff0c;如下 {"usingComponents": {},"enablePullDownRefresh": true } 2.上拉触底事件 在很多时候&#x…

【JAVA数据结构】简单洗牌算法——ArrayList(顺序表)使用实例

详细知识讲解请跳转&#xff1a;【JAVA数据结构】&#xff08;ArrayList&#xff09;顺序表-CSDN博客 一. 简单的洗牌算法 特殊知识须记&#xff1a; List < List<E> > 该语法情况比较特殊&#xff0c;相当于一个“二维数组”存着一个个线性表的结构&#xff0…

火星舱MSA-DRS-E24H更换故障硬盘流程(已踩坑)

该设备是2017年采购的&#xff0c;主要使用数字资源站&#xff08;即文件共享功能&#xff09;&#xff1b;更换硬盘之前出过一次故障&#xff0c;所有硬盘灯&#xff0c;网口灯全部不亮&#xff0c;最后维修了主板&#xff0c;可以正常进入系统了&#xff0c;但是发现了一块硬…

Nature子刊:教你零基础开展微生物组数据分析和可视化

使用MicrobiomeAnalyst进行微生物组数据的全面统计、功能和元分析 Using MicrobiomeAnalyst for comprehensive statistical, functional, and meta-analysis of microbiome data Nature Protocols Impact Factor 11.334 https://doi.org/10.1038/s41596-019-0264-1 发表日…

【机器学习】从零开始理解深度学习——揭开神经网络的神秘面纱

【机器学习】从零开始理解深度学习——揭开神经网络的神秘面纱 1. 引言 深度学习是机器学习的一个重要分支&#xff0c;通过多层神经网络处理复杂数据&#xff0c;广泛应用于图像识别、自然语言处理等领域。我们将在这篇文章中揭开深度学习和神经网络的神秘面纱。 2. 什么是…

ABAP CURSOR游标的应用1

【应用场景】BW模块定时增量抽取SAP的销售案场收款单的业务主数据 【关键语法】 FUNCTION ZBWFM_ZTSD0011 . *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" VALUE(I_REQ…

ipad如何强制关机重启

背景起因 上午同事小孩ipad死机了&#xff0c;输入密码没有反应&#xff0c;无法进入设备&#xff0c;使用下面的方法都无法强制关机重启 长按电源键N秒长按 电源键任意音量键&#xff08;出现滑动关机按钮 但无法滑动&#xff09;悬浮球--->更多--->设备--->重启 无…

骨传导耳机哪款好?精选五款热门骨传导耳机分享让你避免踩雷

目前在市面当中&#xff0c;骨传导耳机被称之为是黑科技耳机&#xff0c;骨传导耳机拥有很多优势&#xff0c;在听歌时不需要入耳&#xff0c;不会伤耳朵。随着骨传导耳机品牌的不断发展&#xff0c;人们在选购骨传导耳机时&#xff0c;也会觉得非常困难&#xff0c;可能一不小…

开源 AI 智能名片小程序在内容营销中的应用与价值

摘要&#xff1a;本文深入探讨在消费升级的时代背景下&#xff0c;开源 AI 智能名片小程序如何在内容营销中发挥重要作用。阐述了内容营销通过图片、文字、视频等媒介传播相关内容信息给目标用户以促进销售及实现营销目的的过程。分析了开源 AI 智能名片小程序作为一种新型营销…

​可看见车辆行人的实时高清视频第1辑

我们在《全球著名地标卫星影像收藏第4辑》分享了10个全球著名地标卫星影像&#xff0c;不过卫星影像是静态的照片。 现在我们为你分享可看见车辆行人的实时动态高清视频&#xff0c;这些视频来自公开的高清摄像头实时直播画面。 我们在文末为你分享了这些实时直播摄像头的点位…