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;
}