Codeforces Round #837 (Div. 2)

news2024/11/16 12:08:38

A. Hossam and Combinatorics

题目链接:Problem - A - Codeforces

样例输入: 

2
5
6 2 3 8 1
6
7 2 8 3 2 10

样例输出:

2
4

题意:给定一个有n个元素的数组,然后让我们求出有多少对(i,j)满足|a[i]-a[j]|=max|a[p]-q[q]|(1<=p,q<=n).

分析:容易发现差的绝对值的最大值一定是数组中的最大值减去最小值得到的,所以我们可以求出来最大值的出现次数cntx和最小值的出现次数cntn,如果最大值等于最小值那么就代表所有的数都是相同的,那么就任意选两个就行,答案就是C(cntn,2)*2,别忘记是带有顺序的,即点对(i,j)和点对(j,i)被看作是不同的点对。如果最大值不等于最小值,那么就随便选一个最大值和一个最小值即可,答案就是cntx*cntn*2.

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		scanf("%d",&n);
		int mn=1e5+1,mx=0,cntn=0,cntx=0;
		for(int i=1;i<=n;i++)
		{
			int t;
			scanf("%d",&t);
			if(t>mx)
			{
				mx=t;
				cntx=1;
			}
			else if(t==mx) cntx++;
			if(t<mn)
			{
				mn=t;
				cntn=1;
			}
			else if(t==mn) cntn++;
		}
		if(mx!=mn) printf("%lld\n",1ll*cntn*cntx*2);
		else printf("%lld\n",1ll*cntn*(cntn-1));
	}
	return 0; 
}

B. Hossam and Friends

题目链接:Problem - B - Codeforces

样例输入: 

2
3 2
1 3
2 3
4 2
1 2
2 3

样例输出:

4
5

题意:一开始给定一个n和m,n代表人数,编号从1~n,m代表关系数,每对关系给定两个编号x和y,代表编号为x的人和编号为y的人不认识,现在按照编号顺序从左到右站成一排,问有多少个区间[l,r]满足区间内的人都是互相认识的。

分析:我们不妨按照以某个点为左区间的满足题意的区间个数的方法进行统计,用r[i]记录与编号为i的人互不认识的人的编号的最小值,那么对于每一个i所能到达的区间右边界的最大值就是min(r[i~n]),那么以编号i为左边界的满足题意的区间个数就是min(r[i~n])-i,而min(r[i~n])我们可以用ST表处理一下就行。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e5+10;
long long r[N],f[N][32];
long long find(int l,int r)
{
	int t=(int)log2(r-l+1);
	return min(f[l][t],f[r-(1<<t)+1][t]);
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		long long n,m;
		scanf("%lld%lld",&n,&m);
		for(int i=1;i<=n;i++) r[i]=n+1;
		for(int i=1;i<=m;i++)
		{
			long long x,y;
			scanf("%lld%lld",&x,&y);
			long long mn=min(x,y),mx=max(x,y);
			r[mn]=min(r[mn],mx);
		}
		for(int i=1;i<=n;i++)
			f[i][0]=r[i];
		
		for(int i=1;i<=30;i++)
		for(int l=1;l-1+(1<<i)<=n;l++)
			f[l][i]=min(f[l][i-1],f[l+(1<<(i-1))][i-1]);
		long long ans=0;
		for(int i=1;i<=n;i++)
			ans+=find(i,n)-i;
		printf("%lld\n",ans);
	}
	return 0;
}

C. Hossam and Trainees

题目链接:Problem - C - Codeforces

样例输入: 

2
3
32 48 7
3
14 5 9

样例输出:

YES
NO

题意:给你n个数,问这n个数中是否存在不互质的两个数,存在输出YES,否则输出NO

分析:欧拉筛预处理一下1e5以内的素数,然后直接用map记录含有每个素数因子的出现次数,如果出现次数大于等于2则说明有多个数含有相同的因子,则说明存在不互质的数对,否则就说明不存在。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e5+10;
long long prime[N],tt;
bool vis[N];
void init()
{
	for(int i=2;i<N;i++)
	{
		if(!vis[i]) prime[++tt]=i;
		for(int j=1;j<=tt&&i*prime[j]<N;j++)
		{
			vis[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
}
int main()
{
	int T;
	cin>>T;
	init();
	while(T--)
	{
		long long n;
		scanf("%lld",&n);
		map<long long,int>mp;
		bool flag=false;
		for(int i=1;i<=n;i++)
		{
			long long t;
			scanf("%lld",&t);
			if(flag) continue;
			for(int j=1;prime[j]*prime[j]<=t;j++)
				if(t%prime[j]==0)
				{
					if(mp[prime[j]])
					{
						flag=true;
						break;
					}
					while(t%prime[j]==0) t/=prime[j];
					mp[prime[j]]=1;
				}
			if(t!=1)
			{
				if(mp[t])
					flag=true;
				mp[t]=1;
			}
		}
		if(flag) puts("YES");
		else puts("NO");
	}
	return 0;
}

D. Hossam and (sub-)palindromic tree

题目链接:Problem - D - Codeforces

样例输入: 

2
5
abaca
1 2
1 3
3 4
4 5
9
caabadedb
1 2
2 3
2 4
1 5
5 6
5 7
5 8
8 9

样例输出:

3
5

题意:给定一棵由26个英文字符组成的字典树,问由两个节点之间的路径所代表的字符串中的最长回文子序列的长度。

分析:先来探讨一个基本的问题:给定一个长度为n的字符串,如何求这个字符串中的最长回文子序列的长度?

这是一个比较经典的问题,可以用区间DP来求解,设f[i][j]表示从第i个字符到第j个字符中的最长回文子序列的长度,那么分下面两种情况:

(1)第i个字符和第j个字符是相同的,那么就有f[i][j]=2+f[i+1][j-1]

(2)第i个字符和第j个字符是不同的,那么就有f[i][j]=max(f[i+1][j],f[i][j-1])

按照这个方法,我们就能在O(n^2)的复杂度内将这个问题解决

而下面这个问题其实也是类似的,只不过是在树上而已。

拿这个图来说,假如我们要求解节点1和节点5之间的最长回文子序列的长度,那么我们首先要看一下节点1和节点5的字符是否相同,发现都是a,那么结果就变为2+节点3和节点4之间的最长回文子序列的长度。这个过程我们可以用记忆化搜索,如果搜索到了已知答案我们就可以直接返回,否则就继续搜索,因为每个区间只会被更新一次,所以总的复杂度就是O(n^2)。按照刚才的方法去搜索可以发现我们是要用到每个节点的父节点的,所以我们可以直接dfs求出每个节点的父节点。讲解题目一开始所引入的例子就是一个已知字符串序列的最长回文子序列的求法,那么在搜索过程中我们可以用栈来记录从根节点到该节点的路径,那么我们直接对这个问题进行求解就可以求出来任意一个节点到其任意一个父节点之间的最长回文子序列的长度,那么至于不存在祖先关系两个节点之间的最长回文子序列的长度我们就可以按照刚才所讲述的关系一步一步向其祖先节点搜索,直至搜索到一方是另一方的祖先节点,那么我们就可以直接返回答案了。整个过程采用记忆化搜索,总体复杂度就是O(n^2),细节比较多,见代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=4e5+10;
int h[N],e[N],ne[N],idx,fa[N];
int f[2003][2003];//f[i][j]表示节点i到节点j的最长回文序列长度 
char s[N];
int st[N],tt;
void add(int x,int y)
{
	e[idx]=y;
	ne[idx]=h[x];
	h[x]=idx++;
}
void dfs(int x,int ffa)
{
	fa[x]=ffa;
	f[x][x]=1;
	st[++tt]=x;
	for(int i=tt-2;i>=1;i--)
		if(s[x]==s[st[i]]) f[x][st[i]]=f[st[i]][x]=2+f[st[i+1]][fa[x]];
		else f[x][st[i]]=f[st[i]][x]=max(f[x][st[i+1]],f[fa[x]][st[i]]);
	for(int i=h[x];i!=-1;i=ne[i])
	{
		int j=e[i];
		if(j==ffa) continue;
		if(s[j]==s[x]) f[j][x]=f[x][j]=2;
		else f[j][x]=f[x][j]=1;
		dfs(j,x);
	}
	--tt;
}
int fun(int x,int y)//求节点x与节点y之间的最长回文子序列长度
{
	if(f[x][y]!=-1) return f[x][y];
	else if(s[x]==s[y]) return f[x][y]=fun(fa[x],fa[y])+2;
	else return f[x][y]=max(fun(fa[x],y),fun(x,fa[y]));
} 
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		scanf("%d%s",&n,s+1);
		int u,v;
		for(int i=1;i<=n;i++) h[i]=-1;
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			f[i][j]=-1;
		idx=0;
		for(int i=1;i<n;i++)
		{
			scanf("%d%d",&u,&v);
			add(u,v);add(v,u);
		}
		dfs(1,-1);
		int ans=0;
		for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
			ans=max(ans,fun(i,j));
		printf("%d\n",ans);
	}
	return 0;
}

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

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

相关文章

Hudi学习01 -- Hudi简介及编译安装

文章目录Hudi简介Hudi概述Hudi特性Hudi使用场景Hudi编译安装安装Maven编译hudi修改pom文件修改源码兼容hadoop3解决spark模块依赖的问题hudi编译命令Hudi简介 Hudi概述 Apache Hudi (Hadoop Upserts Delete and Incremental) 是下一代流数据湖平台。Apache Hudi 将核心仓库和…

并发编程中用到的几种常见锁

没有加锁而造成的数据竞争 任务&#xff1a;使用10个线程&#xff0c;同时对一个count加100000&#xff1b;最后我们期望的结果是100000&#xff1b; 实验代码&#xff1a; #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <ti…

git项目 拉项目 提交 上传 保姆级教程

git 项目拉取提交 下载git https://git-scm.com/ 拉取代码 打开需要存代码的位置 右键 git bash打开git客户端 输入命令 git clone [复制的地址]上传代码 修改代码 方法一&#xff1a;命令行 打开对应的文件夹&#xff0c;右键打开git bash 拉取最新代码&#xff08;选…

React学习07-React扩展知识

setState setState更新状态的2种写法: setState(stateChange, [callback])------对象式的setState stateChange为状态改变对象(该对象可以体现出状态的更改)callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用 setState(updater, [callback])-…

代码随想录算法训练营第九天(字符串)| 28. 实现 strStr(),459.重复的子字符串

代码随想录算法训练营第九天&#xff08;字符串&#xff09;| 28. 实现 strStr()&#xff0c;459.重复的子字符串 28. 实现 strStr() 因为KMP算法很难&#xff0c;大家别奢求 一次就把kmp全理解了&#xff0c;大家刚学KMP一定会有各种各样的疑问&#xff0c;先留着&#xff0…

Qt编写雷达模拟仿真工具2-自定义QGraphicsItem按钮

一、前言 雷达模拟仿真工具&#xff0c;整体结构采用的QGraphicsView框架&#xff0c;场景需要设计一个可点击的自定义按钮出来&#xff0c;在QGraphicsView中一切基础元素点都是基于QGraphicsItem&#xff0c;在QGraphicsItem类中我们可以看到它不继承自QObject&#xff0c;那…

25万美金奖励章鱼加速器2022冬季获胜团队!

全长 1427 字&#xff0c;预计阅读 6 分钟 作者&#xff1a;MiX 2022年12月21日&#xff0c;章鱼加速器2022年冬季 Web3 创业营圆满落幕&#xff0c;61个入营项目中有5个脱颖而出&#xff0c;获得「章鱼未来之星」称号&#xff0c;排名不分先后&#xff0c;他们分别是&#xf…

第五章. 可视化数据分析图表—Seaborn图表(折线图,直方图,条形图,散点图)

第五章. 可视化数据分析图 5.7 Seaborn图表 Seaborn是一个基于Matplotlib的高级可视化效果库&#xff0c;偏向于统计图表&#xff0c;主要针对的是数据挖掘和机器学习中的变量特征选取&#xff0c;相比Matplotlib&#xff0c;他的语法相对简单&#xff0c;但是具有一定的局限性…

Windows下安装oracle19c

oracle 19c 不支持 Windows 7 和 Windows 8 以及 Windows Server 2008&#xff08;GetOverlappedResultEx function 函数不支持 win7&#xff09;&#xff0c;支持 Windows 8.1 以上及 Windows Server 2012 1.下载地址&#xff1a; https://www.oracle.com/database/technolo…

Gnoppix Linux 22.12 发布

导读基于 Kali Linux 的 Linux 滚动发行版 Gnoppix 22.12 带来了 GNOME 43、Linux 内核 6.0 和新的升级。作为传统的现场 CD 发行版 Knoppix 项目的继承者&#xff0c;Gnoppix Linux 是专门为渗透测试和反向工程而设计的。它为网页应用安全和数字权利保护进行了优化。除了对安全…

DNA甲基化重编程为红梨中光诱导的花青素生物合成提供了见解

期刊&#xff1a;Plant Science 影响因子&#xff1a;5.363 发表时间&#xff1a;2022 样本类型&#xff1a;果皮 客户单位&#xff1a;南京农业大学 凌恩生物客户南京农业大学吴俊团队发表在《Plant Science》上的文章“DNA methylatio…

【Ctfer训练计划】——(七)

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

【数据结构】LinkedList与链表

作者&#xff1a;✿✿ xxxflower. ✿✿ 博客主页&#xff1a;xxxflower的博客 专栏&#xff1a;【数据结构】篇 语录&#xff1a;⭐每一个不曾起舞的日子&#xff0c;都是对生命的辜负。⭐ 文章目录✿1.ArrayList的缺陷✿2.链表2.1链表的概念及结构2.2链表的模拟实现MySingleLi…

aws eks 集群container runtime升级容器管理工具的切换

参考资料 https://cloud-atlas.readthedocs.io/zh_CN/latest/kubernetes/debug/crictl.htmlhttps://zhuanlan.zhihu.com/p/562014518 container runtime Low-Level和High-Level容器运行时。runc、lxc、lmctfy、Docker&#xff08;容器&#xff09;、rkt、cri-o。每一个都是为…

springboot simple (12) springboot RabbitMQ

这里首先简单的介绍了RabbitMQ &#xff0c;然后实现了springboot集成RabbitMQ &#xff0c;包含两个工程&#xff1a; 1 Producer 生产者 2 Consumer 消费者 1 RabbitMQ 简介 AMQP &#xff1a;Advanced Message Queue&#xff0c;高级消息队列协议。 RabbitMQ 是一个由 Erl…

智能大屏兴起,酷开科技赋能营销战略!

随着科技的发展&#xff0c;智能大屏的功能与技术都在日新月异的快速更迭&#xff0c;年轻消费群体也对大尺寸智能大屏表现出了特别的偏爱&#xff0c;以前说到看视频、网上购物、阅读书籍时&#xff0c;人们第一时间就会想到手机&#xff0c;但随着智能大屏的出现&#xff0c;…

商用设计素材库,设计师必备。

免费、商用设计素材网站。 1、菜鸟图库 https://www.sucai999.com/?vNTYxMjky站内平面海报、UI设计、电商淘宝、免抠、高清图片、样机模板等素材非常齐全。还有在线抠图、CDR版本转换功能&#xff0c;能有效的为设计师节省找素材时间&#xff0c;提高工作效率。网站素材都能免…

LeetCode链表经典题目(二)

1. LeetCode203. 移除链表元素 2. LeetCode707.设计链表 3. LeetCode206. 反转链表 4. LeetCode24. 两两交换链表中的节点​ 5. LeetCode19. 删除链表的倒数第 N 个结点 6. LeetCode面试题 02.07. 链表相交 7. LeetCode142. 环形链表 II​ 1. LeetCode203. 移除链表元素 …

基于同豪的道路桥梁设计方案如何实现数字化交付(web发布)

0序&#xff1a; 当下有部分设计人员除了使用Revit、Microstation之外也使用过程的同豪软件进行道路桥梁的BIM建模。如何对同豪的BIM模型进行数字化交付呢&#xff1f; 1数据导出为FBX 具体导出过程可以参考&#xff1a; 数据的导出只要按步骤导出就行&#xff0c;非常简单…

2023最让人期待的日历!每个IT技术人必备

一转眼&#xff0c;2022年已经要接近尾声了..... 这一年的你过的怎么样呢&#xff1f;相比上一年的自己有什么变化呢&#xff1f; 凡是过往皆为序章&#xff0c;所有将来皆为可盼&#xff01;在2023年即将到来之际给大家推荐一本非常适合IT技术人的日历&#x1f449;「小滴日历…