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;
}
相关推荐
c++之路17 分钟前
备忘录模式(Memento Pattern)
c++·microsoft
天恩软件30 分钟前
一分钟学会 C++ 标准模板库智能指针
c++·智能指针
j7~37 分钟前
【C++】STL--Vector容器--拆析解剖Vector的实现以及Vector的底层详解(1)
开发语言·c++·vector·迭代器失效·迭代器的使用
森G40 分钟前
76、仿ASIO实现的Linux c++服务器------服务器源码解析----云视频服务项目
c++·qt
TCW11211 小时前
AI底层系列:用C++实现线性代数的公式推导与算法设计-6.线性方程组的解集
c++·人工智能·算法
小欣加油1 小时前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
拳里剑气1 小时前
C++算法:链表
c++·算法·链表
superkcl20221 小时前
【QT Thread】
c++·qt
旖-旎1 小时前
《LeetCode 417 太平洋大西洋水流问题 FloodFill DFS 解法》
c++·算法·深度优先·力扣·floodfill
鱼子星_1 小时前
C++从零开始系列篇(二):C++入门——函数重载,引用,inline与nullptr
开发语言·c++·笔记