acwing第75场周赛
这次题比较水,但是还是没能ak,自己小结一下吧
第一道题就是自己枚举相加就行
第二道题是一个多关键字排序,wa了几次,是因为优先级有两个是相同的需要特判一下,然后可以把字符转化为数字的优先级,我用了一个hash。
第三题原来没太懂,后来明白了就是对一个无向图进行深度优先遍历就行了。
总结:自己虽然好多知识点已经学过了,但是做题还是不会用,还是不能发现题目中的一些性质,还是得多练!只要不断地前进,尽管走的很慢,总有一天会变强的!
这里只记录一下第三题的代码
给定一个 n
个节点的树,节点编号为 1∼n
。
树的根节点编号 r1
已知,每个节点(r1
除外)的父节点编号 pi
已知。
现在,我们要重新指定树的根节点,更具体地说,我们要将树的根节点从 r1
变换为 r2
。
请你计算并输出,变换树根后,每个节点(r2
除外)的父节点编号。
输入格式
第一行包含三个整数 n,r1,r2
,分别表示节点数量、原根节点编号、新根节点编号。
第二行包含 n−1
个整数,表示每个节点(r1
除外)的父节点编号 pi
。
输入保证,编号越小的节点,其父节点编号越先给出。
输出格式
在一行中输出 n−1
个整数,表示变换树根后,每个节点(r2
除外)的父节点编号。
输出应保证,编号越小的节点,其父节点编号越先输出。
数据范围
前 5
个测试点满足 2≤n≤10
。
所有测试点满足 2≤n≤50000
,1≤r1≠r2≤n
,1≤pi≤n
。
输入样例1:
3 2 3
2 2
输出样例1:
2 3
输入样例2:
6 2 4
6 1 2 4 2
输出样例2:
6 4 1 4 2
#include<iostream>
#include <cstring>
using namespace std;
const int N = 5e5 + 10;
int h[N], e[N], ne[N], idx;
int p[N], r1, r2, n;
void add(int a, int b)
{
e[idx] = b; ne[idx] = h[a], h[a] = idx ++;
}
void dfs(int u, int fa)
{
p[u] = fa;
for(int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if(j == fa) continue;
dfs(j, u);
}
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> r1 >> r2;
for(int i = 1; i <= n; ++i)
{
if(i == r1) continue;
int b; cin >> b;
add(i, b); add(b, i);
}
dfs(r2, -1);
for(int i = 1; i <= n; ++ i)
{
if(i == r2) continue;
cout << p[i] << ' ';
}
return 0;
}