20240529训练题目(西安交通大学 2024年程序设计竞赛校赛)

题目

D题

欢迎来到瑟莉姆大人的享乐宴会!

宴会中一共有n个访客,编号1∼n。为了更好地控制影的力量,瑟莉姆要求有n−1个访客都恰好受

到另一个访客的支配,而剩下的那个人成为总支配者,支配其他n−1名访客。访客间的直接支配关系

构成了一棵有根树。

对于这棵树来说,若结点a的父结点是b,那么称b支配了a,同时称b是a的直接支配者。同时,支

配的关系具有传递性,即若a支配b,b支配c,那么a也就支配了c。

另外有m个支配条件,一个支配条件是一个有序二元组(x,y)(1≤x,y≤n,x=y),若访客x支配y,

那么影的力量会增加1点;若y支配x,那么影的力量会减少1点。若两者互不支配,那么影的力量不

变。初始的影的力量是0。

作为贴心仆人的松雀需要组织一场宴会,那么需要为宴会中的每个人安排支配关系。由于瑟莉姆大人不需要关心影的力量能够达到多大,只需要让影的力量保持非负,你能够帮助她构造最终的支配关系吗?

若存在多个解,你只需要输出任意一个。保证对于任何合法输入,均存在解。

输入格式

第一行输入两个正整数n(1≤n≤1×105),m(1≤m≤2×105),表示访客数量和支配条件数,用空

格隔开。

接下来m行,每行两个用空格分隔的正整数x,y(1≤x,y≤n,x=y),表示一个支配条件的二元组

(x, y)。支配条件可能会重复,也可能会出现相反的支配条件,即既出现了(x,y),也出现了(y,x)。支配

条件两两互不影响。

输出格式

输出一行n个数,第i个数表示编号为i的访客的直接支配者编号。总支配者的直接支配者编号为0。

AC代码

cpp 复制代码
//直接找到未出现的或者第一个非负的影值为小总支配者
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
pair<int,int> q[N];
int st[N];
int main()
{
	int n,m;
	cin>>n>>m;
	int a,b;
	for(int i=0;i<m;i++)
	{
		cin>>a>>b;
		q[a].first++;
		q[b].second++;
		st[a]=st[b]=1;
	}
	int k=1;
	for(int i=1;i<=n;i++)
	{
		if(st[i]==0||q[i].first>=q[i].second)
		{
			k=i;
			break;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(i!=1)cout<<" ";
		if(i==k)	cout<<'0';
		else	cout<<k;
	}
	return 0;
}

E题

西安交通大学下雪了,所有楼顶都被积雪覆盖。

在梧桐道上有 n 座房子,自南向北第i座房子的标号是i,所有房子的高度互不相同。LNC从南向北,

依次登上每栋楼楼顶,然后他会回头观察他已经到达过的房子,并记录下这些房子中,比当前他所在房

子矮的所有房子中,最高的房子的编号,记为ai。特殊的,当没有房子比当前房子矮的时候,ai=0。

现在给你所有的ai,要求你还原出所有楼的大小关系。由于高度的具体值未知,你只需要按照高度从低

到高,输出房子编号。

可以证明对于任何合法的输入,均存在唯一解。

输入格式

输入第一行一个正整数n(1≤n≤2×105),代表房子个数。

接下来一行n个非负整数ai,满足0≤ai<i,两两之间用空格隔开。

输出格式

输出一行n个正整数构成的排列,用空格隔开,表示最终的答案。

AC代码

cpp 复制代码
//树的前序
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> >a;
vector<int>b;
int cnt=0;
void dfs(int u)
{
	b[u]=cnt++;
	vector<int> &now=a[u];
	for(int i=now.size()-1;i>=0;i--)	dfs(now[i]);
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;cin>>n;
	a=vector<vector<int> >(n+1);
	b=vector<int>(n+1);
	for(int i=1;i<=n;i++)
	{
		int x;cin>>x;
		a[x].push_back(i);
	}
	dfs(0);
	vector<pair<int,int> >ans;
	for(int i=1;i<=n;i++)
	{
		ans.push_back({b[i],i});
	}
	sort(ans.begin(),ans.end());
	for(int i=0;i<ans.size();i++)
	{
		cout<<ans[i].second<<' ';
	}
	return 0;
}

O题

在算法竞赛的数论知识中,我们接触过埃拉托斯特尼筛法、线性筛法、莫比乌斯反演、杜教筛、Powerful

Number 筛、Min_25 筛、洲阁筛等算法来帮助我们优化一些求和/连乘的复杂度,那么现在问题来了,

今天这道题将会使用到上述的哪个算法呢?

现在给定正整数n,需要你求

n (i=1) n (j=1) ⌊ n / max(i,j) ⌋[i ⊥ j]

其中[i⊥j] 表示 i,j 是否互素,即当gcd(i,j)=1 时,[i⊥j] 的值为 1,其余情况其值为 0。

输入格式

输入一行一个正整数n(1≤n≤109)。

输出格式

输出一行一个整数,表示这个和式的结果。

AC代码

cpp 复制代码
//推出公式
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	int n;
	cin>>n;
	cout<<n*n;
	return 0;
}
相关推荐
别NULL3 小时前
机试题——疯长的草
数据结构·c++·算法
CYBEREXP20084 小时前
MacOS M3源代码编译Qt6.8.1
c++·qt·macos
yuanbenshidiaos4 小时前
c++------------------函数
开发语言·c++
yuanbenshidiaos4 小时前
C++----------函数的调用机制
java·c++·算法
tianmu_sama4 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
羚羊角uou5 小时前
【C++】优先级队列以及仿函数
开发语言·c++
姚先生975 小时前
LeetCode 54. 螺旋矩阵 (C++实现)
c++·leetcode·矩阵
FeboReigns5 小时前
C++简明教程(文章要求学过一点C语言)(1)
c语言·开发语言·c++
FeboReigns5 小时前
C++简明教程(文章要求学过一点C语言)(2)
c语言·开发语言·c++
264玫瑰资源库5 小时前
从零开始C++棋牌游戏开发之第二篇:初识 C++ 游戏开发的基本架构
开发语言·c++·架构