Codeforces Round #835 (Div. 4) A~G

news2024/11/28 4:45:26

比赛链接:https://codeforces.com/contest/1760

A. Medium Number 

题目大意:

t组测试,每组给三个数求中位数。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define endl '\n'
using namespace std;
void solve()
{
	int a[3];
	cin>>a[0]>>a[1]>>a[2];
	sort(a,a+3);
	cout<<a[1]<<endl;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

B. Atilla's Favorite Problem 

题目大意:

t组测试,每组给一个字符串,字母表顺序a-z中从a开始,最短多长可以包含给定的字符串。

思路:

找字符串中出现最大的字母。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define endl '\n'
using namespace std;
void solve()
{
	int n,mx=0;
	string s;
	cin>>n>>s;
	rep(i,0,n) mx=max(mx,s[i]-'a');
	cout<<mx+1<<endl;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

 C. Advantage

题目大意:

t组测试,每组给一个长度为n的数组,输出数组每一个数和数组中最大值的差,如果等于最大值输出其与第二大值的差。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define endl '\n'
using namespace std;
const int N=2e5+10;
int a[N];
void solve()
{
	int n,mx1=0,mx2=0;
	cin>>n;
	rep(i,0,n){
		cin>>a[i];
		if(a[i]>=mx1) mx2=mx1,mx1=a[i];
		else if(a[i]>mx2) mx2=a[i];
	}
	rep(i,0,n) if(a[i]==mx1) cout<<a[i]-mx2<<" "; else cout<<a[i]-mx1<<" ";
	cout<<endl;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

 D. Challenging Valleys

题目大意:

 t(1≤t≤10^4)组测试,每组给定长度为n(1≤n≤2⋅10^5)的数组,1≤ai≤10^9,问是否仅仅存在一段[l,r]满足:

1.[l,r]中每个ai相等;

2.l=0 or a_{l-1}>a_{l}

3.r=n−1 or a_{r}>a_{r+1}.

思路:

双指针。处理一段连续相等的一段[l,r],判断两边是否合法,然后将l指针指向r指针。时间复杂度为O(n)

为方便处理可两个边界设置哨兵。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define endl '\n'
using namespace std;
const int N=2e5+10;
int a[N];
void solve()
{
	int n;
	cin>>n;
	rep(i,1,n+1) cin>>a[i];
	a[n+1]=2e9;
	int cnt=0;
	rep(i,1,n+1){
		int r=i;
		while(r+1<=n&&a[r+1]==a[r]) ++r;
		if(a[i-1]>a[i]&&a[r+1]>a[r]) ++cnt;
		if(cnt>1){
			cout<<"NO"<<endl;
			return;
		}
		i=r;
	}
	if(cnt==1) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	cin>>_;
	a[0]=2e9;
	while(_--){
		solve();
	}
	return 0;
}

E. Binary Inversions

题目大意:

 t(1≤t≤10^4)组测试,每组给定长度为n(1≤n≤2⋅10^5)的数组,数组中元素为0或1。问仅可以修改一次,某一个0改为1或者1改为0,整个数组逆序对最大为多少。

思路:

预处理两个前缀和。s0[i]表示1-i中0出现的次数,s1[i]表示1-i中1出现的次数。一个0的位置会和它前面所有的1形成逆序对,所以初始逆序对个数就是\sum s1[i-1],之中i为第i个a[i]=0。

某个位置i为0,如果将其改成1,减少的逆序对个数为前面1的个数:s1[i-1],增加的逆序对个数为后面0的个数:s0[n]-s0[i]。显然i越靠左边,减少的越少,增加的越多。

将1改为0同理,靠右为最优。

比较两个修改和不修改取最大即可。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define endl '\n'
using namespace std;
typedef long long LL;
const int N=2e5+10;
int a[N],s0[N],s1[N];
void solve()
{
	int n,lst=0,pre=0;
	LL ans=0;
	cin>>n;
	rep(i,1,n+1){
		cin>>a[i];
		s1[i]=s1[i-1],s0[i]=s0[i-1];
		if(a[i]) ++s1[i],lst=i;
		else{
			++s0[i],ans+=s1[i-1];
			if(pre==0) pre=i;
		}
	}
	int mx=0;
	if(pre) mx=max(mx,s0[n]-s0[pre]-s1[pre]);
	if(lst) mx=max(mx,s1[lst-1]-(s0[n]-s0[lst]));
	cout<<ans+mx<<endl;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

F. Quests

题目大意:

t(1≤t≤10^4)组测试,每组给定长度为n(1≤n≤2⋅10^5)的数组,以及价值c,天数d。选择数组ai可以获得ai的价值,但是在k天之内都不能再选择ai。问求k的最大值,满足能在d天内可以有获得价值大于等于c的方案。

思路:

贪心策略先选择大的。将数组从大到小排序,再维护前缀和数组s。考虑k为无穷的情况,如果前d个a[i]加起来>=c,说明可以取无穷。如果k=0,d天中每一天都选最大的,仍<c,说明不存在。

如果存在需要找满足条件的最大k,对k在0-d做二分即可。

判断函数:考虑最优策略计算价值,第一天选了a[1],需要经过k天才能在选择a[1],期间可以选a[2],a[2]...a[k+1],等到经过k天之后a[1]可以再选,再经过一天a[2]可以再选。重复这个过程,保证每一天都尽量选前面比较大的值。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define endl '\n'
using namespace std;
typedef long long LL;
const int N=2e5+10;
int a[N];
int n,d;
LL c,s[N];
bool cmp(int x,int y)
{
	return x>y;
}
bool che(int m)
{
	int q=d/(m+1),r=d%(m+1);
	LL res=s[min(m+1,n)]*q+s[min(r,n)];
	if(res>=c) return true;
	return false;
}
void solve()
{
	cin>>n>>c>>d;
	rep(i,1,n+1) cin>>a[i];
	sort(a+1,a+n+1,cmp);
	rep(i,1,n+1) s[i]=s[i-1]+a[i];
	if(1ll*a[1]*d<c){
		cout<<"Impossible"<<endl;
		return;
	}
	if(s[min(d,n)]>=c){
		cout<<"Infinity"<<endl;
		return;
	}
	int l=0,r=d;
	while(l<r){
		int m=l+r+1>>1;
		if(che(m)) l=m;
		else r=m-1;
	}
	cout<<l<<endl;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

G. SlavicG's Favorite Problem

题目大意:

 t(1≤t≤10^4)组测试,每组给定n(1≤n≤2⋅10^5)个结点的树,结点编号1-n,树上每一条边有一个权值,问能否从a点走到b点,且路径所有边异或值为0。

运行在任意点进行一次传送,可以传送到除了b点之外的任意一点。

思路:

两次搜索,搜索时维护当前异或值。第一次从a搜到b的邻接点,判断能否走到b点。如果能不需要进行第二次搜索。

在第一次搜索的时候将所有得到异或值记录到集合中,第二次从b开始搜索,如果到某个点的异或和在能集合中找到,说明存在合法路径:a-i点的异或值为x,b-j点的异或值也为x,可以先从a走到i,使用一次传送到j点,走到b,此时总异或和为0。

注意处理边界情况,必须先将0加入集合中,因为a点本身也是可传送点。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include<bitset>
#include<list> 
#include <algorithm>
#define pii pair<int,int>
#define pll pair<LL,LL>
#define pil pair<int,LL>
#define pli pair<LL,int>
#define pdd pair<db,db>
#define se second 
#define fi first
#define endl '\n'
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define MEM(a,x) memset(a,x,sizeof(a))
#define M(x) ((x)%MOD)
#define db double
#define eps 1e-9
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
const LL MOD=998244353;
const int N=1e5+10,M=2*N;
int h[N],e[M],ne[M],idx,w[M];
set<int>st;
int n,a,b;
bool f;
void add(int x,int y,int c)
{
	e[idx]=y,ne[idx]=h[x],w[idx]=c,h[x]=idx++;
}
void dfs1(int u,int fa,int v)
{
	if(f) return;
	for(int i=h[u];i!=-1;i=ne[i]){
		int j=e[i];
		if(j==fa) continue;
		if(j==b){
			if(v==w[i]){
				f=1;
				break;
			}
			else continue;
		}
		st.insert(v^w[i]);
		dfs1(j,u,v^w[i]);
	}
}
void dfs2(int u,int fa,int v)
{
	if(f) return;
	for(int i=h[u];i!=-1;i=ne[i]){
		int j=e[i];
		if(j==fa) continue;
		if(st.count(v^w[i])){
			f=1;
			return;
		}
		dfs2(j,u,v^w[i]);
	}
}
void solve()
{
	st.clear();st.insert(0);
	f=0;
	idx=0;
	MEM(h,-1);
	cin>>n>>a>>b;
	rep(i,0,n-1){
		int x,y,c;
		cin>>x>>y>>c;
		add(x,y,c),add(y,x,c);
	}
	dfs1(a,-1,0);
	if(f){
		cout<<"YES"<<endl;
		return;
	}
	dfs2(b,-1,0);
	if(f) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
}
int main()
{
//	#ifndef ONLINE_JUDGE
//    freopen("title.in","r",stdin);
//    freopen("title.out","w",stdout);
//    #endif
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
//	rep(i,1,_+1){
//		printf("Case %d: ",i);
//		solve();
//	}
	return 0;
}

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

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

相关文章

无人驾驶(二)---室外导航之RTK配置与接入及GPS与UTM坐标转换

1. RTK 概述 RTK 载波相位差分技术&#xff0c;是实时处理两个测量站载波相位观测量的差分方法&#xff0c;将基准站采集的载波相位发给用户接收机&#xff0c;进行求差解算坐标。一般包含流动站 (移动站) 和基准站 (基站) 。本文中RTK定位采用千寻定位&#xff0c; 参考的也是…

39Java System类

目录 System类 1.定义 2.预备知识 3.常用方法 (1).currentTimeMillis返回系统时间 (2).exit终止虚拟机 (3).arraycopy拷贝数组 System类 1.定义 Java System类是一个提供与系统相关的方法 System类所在包为java.lang包&#xff0c;因此在使用的时候不需要进行导包。并且Sy…

外汇天眼:FCA 已向交易应用程序运营商发出警告,要求其停止交易游戏化

英国市场监管机构希望交易应用程序开发商重新考虑关键设计元素。 根据新的研究&#xff0c;游戏化可能会导致类似赌博的行为。 负责监管英国金融市场的金融行为监管局 ( FCA )周一发布了有关交易应用程序设计的市场警告。金融业监管机构担心零售交易越来越像一场游戏&#xff…

A. Row GCD(更相减损术+gcd的性质)

Problem - 1458A - Codeforces 给你两个正整数序列a1,...,an和b1,...,bm。对于每个j1,...,m&#xff0c;求a1bj,...,anbj的最大公除数。 输入 第一行包含两个整数n和m&#xff08;1≤n&#xff0c;m≤2⋅105&#xff09;。 第二行包含n个整数a1,...,an&#xff08;1≤ai≤101…

Linux学习记录——이 基本指令(2)

接着上一篇继续写指令。 man指令 man指令是一个手册功能的指令&#xff0c;可以查看系统内的接口&#xff0c;指令等等&#xff0c;也可以查看一个指令有什么用法。如果是需要查看C语言中的指令&#xff0c;比如printf&#xff0c;就可以man 3 printf。不过man大多数情况是用…

旋转数组的最小数字、二维数组中的查找、调整数组顺序使奇数位于偶数前面

文章目录1、 旋转数组的最小数字2、调整数组顺序使奇数位于偶数前面3、二维数组中的查找1、 旋转数组的最小数字 本题考点&#xff1a;核心考点&#xff1a;数组理解&#xff0c;二分查找&#xff0c;临界条件 牛客链接 题目描述&#xff1a; 有一个长度为 n 的非降序数组&am…

简述Spring Bean生命周期

前言 在Spring容器里&#xff0c;Bean的完整生命周期比较长。但是我们必须要掌握它。 Bean周期总览 Bean周期总体如下所示。 接下来会简单讲下各个步骤的主要功能。 Bean实例化 必须步骤。 此步骤主要是实例化一个Bean&#xff0c;例如new一个对象。这个步骤主要是设置be…

运动无线耳机什么牌子好?六款实用性不错的运动耳机推荐

跑步的过程如果没有音乐真的很难继续跑下去&#xff0c;当然&#xff0c;有了音乐的加入&#xff0c;运动过程也变得更加有动力&#xff0c;烦恼的心情也会随着烟消云散。一款好的运动耳机能让我们运动变得更加轻松&#xff0c;什么运动耳机值得大家入手&#xff1f;今天我就来…

计算机毕业设计java+ssm舞蹈管理系统(源码+系统+mysql数据库+Lw文档)

项目介绍 舞蹈管理系统是使用JAVA的SSM技术&#xff0c;MySQL作为数据库开发&#xff0c;用户通过查看舞蹈信息&#xff0c;在线预约课程&#xff0c;实现舞蹈管理。首先对本论文进行分析后&#xff0c;提出平台的相关技术&#xff0c;然后整理系统的需求分析&#xff0c;根据…

_c++11( lambda)

lambda表达式1 C98中的一个例子2 lambda表达式3 lambda表达式语法4 函数对象与lambda表达式1 C98中的一个例子 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法。 #include <algorithm> #include <functional> voi…

[附源码]计算机毕业设计JAVA教师业绩考核系统

[附源码]计算机毕业设计JAVA教师业绩考核系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

Sharding-JDBC 基础

Sharding-JDBC 是当当网开源的适用于微服务的分布式数据访问基础类库&#xff0c;完整的实现了分库分表&#xff0c;读写分离和分布式主键功能&#xff0c;并初步实现了柔性事务。 从 2016 年开源至今&#xff0c;在经历了整体架构的数次精炼以及稳定性打磨后&#xff0c;如今…

AQS源码解析 3.lock() unlock() 加锁解锁过程

AQS源码解析 3.lock() & unlock() 加锁解锁过程 Lock() 过程 这里使用 ReentrantLock 的公平锁去看 AQS 的加锁过程。在 ReentrantLock 的实现中&#xff0c;其默认构造的锁是非公平锁。 详细流程图 尝试获取锁 构造节点入队过程 在队列中被挂起 被唤醒重新抢锁的过…

说一下 ArrayList 和 LinkedList 的区别?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了基于动态数组 ArrayList 线性表&#xff0c;今天我们来讨论一个基于链表的线性表 —— LinkedList…

JavaScript构造函数和原型:ES5 中的新增方法

ES5 新增方法概述 ES5 中给我们新增了一些方法&#xff0c;可以很方便的操作数组或者字符串&#xff0c;这些方法主要包括&#xff1a; 数组方法 字符串方法 对象方法 数组方法 迭代(遍历)方法&#xff1a;forEach()、map()、filter()、some()、every()&#xff1b; arr…

AVL右旋转思路分析与图解

AVL树右旋转思路分析与图解 其实我们前面讲过了左旋转之后再学习右旋转就会非常的简单了, 因为我们的右旋转相对我们的左旋转只是换了一个方向而已, 那么下面我们就来讲解右旋转的实现 对于数列{10, 12, 8, 9 ,7, 6} , 当我们插入6的时候leftHeight() - rightHeight() > 1…

Linux 之 Ubuntu 代码开发工具 Visual Studio Code(VSCode) 的安装与一些常用插件配置的简单整理

Linux 之 Ubuntu 代码开发工具 Visual Studio Code(VSCode) 的安装与一些常用插件配置的简单整理 目录 Linux 之 Ubuntu 代码开发工具 Visual Studio Code(VSCode) 的安装与一些常用插件配置的简单整理 一、简单介绍 二、Visual Studio Code 下载与安装 三、 Visual Studio…

【操作系统】第一章总结

1.1 操作系统介绍 1.1.1 操作系统的概念、功能和目标 1.1.1 操作系统的概念、功能和目标&#xff08;系统资源的管理者、提供接口、作为扩充机器、虚拟机&#xff09;_StudyWinter的博客-CSDN博客 1.1.2 操作系统的特点 1.1.2 操作系统的特征&#xff08;并发、共享、虚拟、…

[附源码]SSM计算机毕业设计基于Java烟支信息管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【计算机视觉OpenCV基础】实验四 尺寸测量

实验四 尺寸测量 计算机视觉OpenCV基础实验合辑&#xff08;实验1234扩展&#xff09; 资源下载地址&#xff1a; https://download.csdn.net/download/weixin_53403301 合辑&#xff1a;&#xff08;加在下载地址后面&#xff09; /87113581 讲义&#xff08;包括理论、图例、…