Codeforces Round #773 (Div. 2)

news2024/12/19 18:43:27

A. Hard Way

题目链接:Problem - A - Codeforces

 样例输入:

5
8 10
10 4
6 2
4 6
0 1
4 2
14 1
11 2
13 2
0 0
4 0
2 4
0 1
1 1
0 0

样例输出:

0.0000000
0
2.0000
0.00
1

题意:给定一个三角形的三个顶点,输入保证三角形的三个顶点是合法的,然后让我们找出满足从x轴上一点向三角形边界上一点连线必须经过三角形内部的点的集合的长度,只要在x轴上存在任意一个点即可。

分析:容易发现,只要是一边斜率不为0那么就一定能够在x轴上找到一个点使得从这一点向三角形该边上一个点连边不经过三角形内部,这个画一下图就很容易发现。那么是不是对于所有的斜率为0的边上的一点与  就一定需要经过三角形内部吗,其实也不一定,如果三角形的斜率为0的边是三角形纵坐标最小的那一条边,那么这条边肯定是不满足题意的,因为这个肯定不需要经过三角形内部,综合以上情况,就是要求斜率为0的边而且纵坐标不是最小的那条边的长度。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N=2e5+10;
int x[5],y[5];
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int ans=0;
		for(int i=1;i<=3;i++)
			scanf("%d%d",&x[i],&y[i]);
		x[4]=x[1];y[4]=y[1];
		for(int i=2;i<=4;i++)
			if(y[i]==y[i-1]&&y[i]==max(max(y[1],y[2]),y[3]))
				ans=abs(x[i]-x[i-1]);
		printf("%d\n",ans);
	}
	return 0;
} 

B. Power Walking

题目链接:Problem - B - Codeforces

样例输入: 

2
3
1 1 2
6
5 1 2 2 2 4

样例输出:

2 2 3 
4 4 4 4 5 6 

题意:现在有n个数,我们要将其随意划分至k个集合,每个集合至少要有一个元素,每个集合的贡献就是这个集合内不同数的个数,现在要我们求得k个集合的贡献和最小是多少,输出n个值,分别对应着k=1,2……,n的情况。

分析:我们先分析一下n个元素中到底存在多少种值不相同的元素,不妨是t,那么无论划分为多少个集合都不可能使得所有集合的贡献和小于t,但是我们能保证当k<=t时,我们总能找到一种方案使得集合的总贡献是等于t的,就是对于值相同的元素我们尽可能把其划分至同一个集合,从而减少这个值对所有集合的贡献和,对于k>t的情况,每多一个集合我们不得不拿出来一个数放入一个新的集合,那么他的贡献就会在原来的基础上+1,一直到划分为n个集合为止,当划分为n个集合时每个集合的贡献都是1,总贡献是n,这样也刚好符合我们的预期。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<set>
using namespace std;
const int N=2e5+10;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		set<int>s;
		int n;
		scanf("%d",&n);
		int t;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&t);
			s.insert(t);
		}
		int m=s.size();
		for(int i=1;i<=m;i++)
			printf("%d ",m);
		for(int i=m+1;i<=n;i++)
			printf("%d ",i);
		puts("");
	}
	return 0;
}

C. Great Sequence

题目链接:Problem - C - Codeforces

样例输入: 

4
4 4
1 16 4 4
6 2
1 2 2 2 4 7
5 3
5 2 3 5 15
9 10
10 10 10 20 1 100 200 2000 3

样例输出:

0
2
3
3

题意:给定一个长度为n的数组a和一个正整数x。问至少需要向原数组中添加多少个数才能够使得操作后的数组可以两两配对使得每一对中的一个数是另一个数的x倍,每次向数组中添加的数可以为任意值。

分析:这个思路就很好想了,我们先把原数组中可以配对的数先进行配对,剩余的数我们没办法再完成配对,只能选择加入一个数来完成该数的配对,所以我们就是要求最少不能配对的数的个数

那么这个我们直接暴力进行配对,对于每一个待配对的数y,我们都看一下x*y是否存在即可,如果存在就进行配对,否则就加入一个数完成配对。但是我们进行暴力配对的时候一定要从小到大进行,避免出现这种情况,比如x=2,原数组是2,4,8,16,我们先把4和8进行配对,那么剩余的2和16都不能进行配对,从而使得答案为2,但实际上我们应该先让2和4进行配对,然后让8和16进行配对,这样就没有不能配对的数了。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int N=2e5+10;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		map<long long,int>mp;
		int n,x;
		scanf("%d%d",&n,&x);
		long long t;
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&t);
			mp[t]++;
		}
		int ans=0;
		for(auto t:mp)
		{
			if(!mp.count(t.first*x))
			{
				ans+=t.second;
				continue;
			} 
			int p=min(t.second,mp[t.first*x]);
			mp[t.first*x]-=p;
			ans+=t.second-p;
		}
		printf("%d\n",ans);
	}
	return 0;
}

D. Repetitions Decoding

题目链接:Problem - D - Codeforces

样例输入:

4
2
5 7
2
5 5
6
1 3 1 2 2 3
6
3 2 1 1 2 3

 样例输出:

-1
0
1
2
4
1 3
5 3
5 3
10 3
2
8 6 
5
0 3
8 3
5 3 
6 2 
7 1
4
2 6 6 2

题意:给定一个长度为n的数组,我们可以对这个数组进行操作,每次选择一个位置,可以在这个位置插入两个数,这两个数必须相同,问我们的操作方案使得操作后的数组可以分成若干个tandem repeats,还需要输出每一个tandem repeats的长度,每个tandem repeats是一个字符串,需要满足长度为偶数而且前半段与后半段完全相同,比如123123就是一个tandem repeats。

分析:由于我们每次都是向数组中同一个位置加入两个相同的数,所以每个数的奇偶性是不会发生改变的,由于tandem repeats的定义我们不难发现,对于tandem repeats中的每一个数的出现次数必须为偶数,所以一开始我们需要判断一下整个数组中有没有一个数的出现次数为奇数的,如果有就直接输出-1.否则我们就需要找到构造出一种方案。

构造方式如下:

以 1 3 1 2 2 3为例:

我们发现第一个1在之后的出现位置为3,那么我们就那这部分进行构造:

1 3 1->1 3 1 3 3

这样构造完1 3 1 3就是一个符合题意的tandem repeats,然后把多出来的3放置后面

剩余的数组为 3 2 2 3

我们发现第一个3在之后的出现位置为4,那么我们就对这部分再进行构造

3 2 2 3 ->3 2 2 3 2 2->3 2 2 3 2 2 2 2

也许会有同学有疑问:在后面添加两次2就已经满足题意了,为什么还要再添加两个2呢?其实这是因为两个2相邻是一种特殊情况,我们为了构造的一般性这里就不对这个进行优化了,毕竟题目中并没有要求最少操作次数,所以我们可以加两次2,需要注意,第二次加入2是加入到第一次加入的两个数中间,对于两次加入的都是同一个数当然没有影响,但是如果要是不同的数就会产生影响,比如先后加入2和3得到的操作序列的变化是2 2->2 3 3 2,下次如果还想加入什么数就加入到上一次操作后的两个数中间,这样我们就可以按照这个方法构造我们想要的任意序列了。这个时候有同学可能会问:这样真的一定能构造出来吗?答案是YES,因为假如我们每次选定的数组长度为n,那么我们就会操作n-2次,那么我们除掉已经构造好的tandem repeats,剩余的数组长度会减少2,而且保证每个数的出现次数为偶数,那么数组第一个数在后面一定还会出现,所以这样一定是可行的,空间复杂度是O(n^2)的。

细节比较多,见代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int N=1e7+10;
int a[N];
int b[N];
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		vector<int> len;
		vector<int> p;
		vector<int> val;
		map<int,int>mp;
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]),mp[a[i]]++;
		bool flag=true;
		for(int i=1;i<=n;i++)
		if(mp[a[i]]&1)
		{
			flag=false;
			break;
		}
		if(!flag)
		{
			puts("-1");
			continue;
		}
		int id=1;
		for(int i=1;i<=n;i+=2)
		{
			int j=i+1;
			while(j<n&&a[j]!=a[i]) j++;
			if(i+1==j&&j==n)
			{
				len.push_back(2);
				break;
			}
			int l=j-i;
			for(int k=i+1;k<j;k++) b[k]=a[k];
			for(int k=1;k<l;k++)
			{
				p.push_back(id+l+k-1);
				val.push_back(a[i+k]);
			}
			for(int k=1;k<l;k++)
				a[i+k+1]=b[i+l-k];
			len.push_back(l*2);
			id+=l*2;
		}
		printf("%d\n",p.size());
		for(int i=0;i<p.size();i++)
			printf("%d %d\n",p[i],val[i]);
		printf("%d\n",len.size());
		for(int i=0;i<len.size();i++)
			printf("%d ",len[i]);
		puts("");
	}
	return 0;
}

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

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

相关文章

echarts画各种形状水波图

各种形状水波图 代码 用的是echarts绘制&#xff0c;echarts相关api可以参考echarts官网&#xff0c;形状修改series.shape即可修改形状&#xff0c;这里用的是SVG路径 <html><head><meta charset"utf-8"><link href"https://fonts.google…

jQuery网页开发案例:jQuery常用API--jQuery 尺寸、位置操作及 电梯导航案例和节流阀(互斥锁)

jQuery 尺寸 以上参数为空&#xff0c;则是获取相应值&#xff0c;返回的是数字型。如果参数为数字&#xff0c;则是修改相应值。参数可以不必写单位。这个width方法不包含边框 innerWidth()包含widthpadding 注意这个要大写 outerWidth()包含width padding border outerW…

(JavaSE) 数组

文章目录1. 数组的作用2. 数组的创建及初始化2.1 数组的创建2.2 数组的初始化3. 数组的使用3.1 数组中元素的访问3.2 遍历数组方法4. 数组是引用类型4.1 JVM中的内存有那些4.2 数组如何开辟空间4.3 数组 null 的意思4.4 引用不能同时指向多个对象4.5 数组作为方法返回值5. 二维…

【一键生成】3DMAX配景楼生成插件使用教程

3DMAX室外设计师常常需要创建各种场景配楼&#xff0c;为了解决大场景制作难的情况&#xff0c;3dMax配景楼生成插件是一款傻瓜式的插件或许更能快速让你从繁重的体力劳动中解脱出来&#xff01; 【安装方法】 方法一&#xff1a;拖动插件文件到3dMax窗口。 方法二&#xff1a;…

MySQL 主要线程

文章目录MySQL 主要线程1. Master thread2. io thread3. purge thread4. page Cleaner ThreadMySQL 主要线程 1. Master thread Master thread有四大循环&#xff0c;分别是loop,background loop&#xff0c;suspend loop&#xff0c;flush loop。且四大循环的作用如下: loop…

第二篇 基于自然语言处理的漏洞检测方法综述

杨伊等 来源&#xff1a;计算机研究与发展 目录 1 相关技术 1.1 自然语言处理 1.2 漏洞检测与分析 据2021年CVE漏洞趋势安全报告&#xff0c;当前漏洞类型占比最大的5类漏洞分别是代码执行、拒绝服务、溢出、跨站脚本以及信息获取。基于自然语言处理技术实现漏洞检测的研究…

STM32F103实现激光测距传感器测距WT-VL53L0 L1

目录 本博客将采用标准库和HAL库实现 所用设备选择 引脚说明 与单片机的接线表 标准库实现 HAL库实现 本博客将采用标准库和HAL库实现 所用设备选择 单片机型号&#xff1a;STM32F103C8T6 激光测距传感器型号&#xff1a;WT-VL53L0 L1 采用串口TTL电平输出&#xff0c;可…

CSDN云IDE初次测评体验

CSDN云IDE初次测评体验 文章目录CSDN云IDE初次测评体验一、前言二、云IDE产品介绍三、云IDE使用教程1、尝试编写Python爬虫代码2、尝试编写Python可视化代码3、尝试连接MySQL数据库四、最后我想说一、前言 最近一直有收到CSDN官方私信参加这个测评云IDE活动&#xff0c;刚好这…

YOLOv5剪枝 | 模型剪枝理论篇 | 1/2

文章目录 1. 前言2. 摘要精读3. 背景4. 本文提出的解决方式5. 通道层次稀疏性的优势6. 挑战7. 缩放因素和稀疏性惩罚8. 利用BN图层中的缩放因子9. 通道剪枝和微调10. 多通道方案11. 处理跨层连接和预激活结构12. 实验结果12.1 CIFAR-10数据集剪枝效果12.2 CIFAR-100数据集剪枝效…

Kafka图形管理界面Kafka-eagle安装配置详解

Kafka Eagle是一款结合了目前大数据Kafka监控工具的特点&#xff0c;重新研发的一块开源免费的Kafka集群优秀的监控工具。它可以非常方便的监控生产环境中的offset、lag变化、partition分布、owner等。 官方网址&#xff1a;EFAK 点击下载&#xff0c;将安装包下载到电脑本地&…

pytoch安装

1、安装 Anaconda 2、检查显卡&#xff0c;驱动&#xff08;检查是否较新&#xff09; winR——cmd&#xff0c;进入命令行&#xff0c;输入&#xff1a; nvidia-smi 如果版本不够&#xff0c;去官网下载Release Notes :: CUDA Toolkit Documentation (nvidia.com) 3、创建P…

【飞桨PaddleSpeech语音技术课程】— 语音识别-流式服务-模型部分

(以下内容搬运自飞桨PaddleSpeech语音技术课程&#xff0c;点击链接可直接运行源码) 流式语音识别模型 Deepspeech2 与 Conformer 1. 前言 1.1 背景知识 语音识别(Automatic Speech Recognition, ASR) 是一项从一段音频中提取出语言文字内容的任务。 (出处&#xff1a;DLHL…

开源监控软件Zabbix5部署实战

系列文章目录 文章目录系列文章目录一、zabbix介绍一、zabbix部署1、zabbix环境2、安装zabbix的安装包安装zabbix_server安装被监控方 web001一、zabbix介绍 百度百科&#xff1a;Zabbix 是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。它是一…

2022-10-27 工作记录--Swiper/React-解决swiper处理动态数据出现样式紊乱、抖动问题

Swiper/React-解决swiper处理动态数据出现样式紊乱、抖动问题 First of all&#xff0c;检查自己在push数据前是否先清空了数组&#xff1a; 若已清空&#xff0c;请直接往下看&#x1f441;&#x1f441;哦&#xff1b;若未清空&#xff0c;请先清空数组&#xff08;可查看我的…

机器学习笔记:支持向量机SVM

1 一些概念 1.1 线性可分 在二维空间上&#xff0c;两类点被一条直线完全分开叫做线性可分。严谨的说法是&#xff1a; D0和 D1 是 n 维欧氏空间中的两个点集。如果存在 n 维向量 w 和实数 b&#xff0c;使得所有属于 D0 的点 xi 都有 wxib>0 &#xff0c;而对于所有属于 …

【面试题】 ES6知识点详细解析

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 &#x1f354;let const 其他知识点补充 块级作用域的补充 const 不可以在循环体里面声明变量给大家推荐一个实用面试…

从零备战蓝桥杯——动态规划(背包dp篇)

双非刷leetcode备战2023年蓝桥杯&#xff0c;qwq加油吧&#xff0c;无论结果如何总会有收获&#xff01;一起加油,我是跟着英雄哥的那个思维导图刷leetcode的&#xff0c;大家也可以看看所有涉及到的题目用leetcode搜索就可以哦&#xff0c;因为避让添加外链&#xff0c;一起加…

【JavaWeb】之Tomcat介绍、安装与使用

【JavaWeb】Tomcat前言一、Tomcat简介1.什么是Tomcat2.其他常用Web服务器二、Tomcat安装1.下载Tomcat2.配置环境变量三、Tomcat使用1.启动与关闭Tomcat2.修改Tomcat的端口号和主机名称3.使用IDEA搭建Web开发环境4.在Tomcat中部署web项目四、Web项目目录结构五、网站访问流程后记…

【Linux】yum vim 基础工具的使用

文章目录1. Linux环境下的软件包管理器---- yum1.2 什么是软件包1.3 yum源镜像配置1.4 yum查看软件包1.5 yum 如何安装软件1.6 yum 如何卸载软件2. Linux编辑器--vim2.1 vim 简介2.2 . vim的基本操作2.3 vim命令模式下的命令集2.3.1 光标移动2.3.2 编辑2.4 vim末行模式下的命令…

Python入门自学进阶-Web框架——24、DjangoAdmin项目应用-定制页面2

这里要实现点击对应的表名称&#xff0c;显示具体表的详细内容&#xff0c;大致的流程是&#xff1a; 前端显示各个表名&#xff0c;如下&#xff1a; <tbody>{% for table_name,admin in app_tables.items %}<tr class"border-bottom"><td style&…