P11486 「Cfz Round 5」Mata rainen
题目背景
题目名称意为:明年见。
小 R 是一个正在上高三的女孩子。她在升入高三的暑假复习了《种树郭橐(tuó)驼传》,便编出了这道与树有关的题。
在把这道题目丢给出题组后,她决定把全部时间和精力投入到高考的旅程中,期待在 2025 年的暑假在算法竞赛中与大家再会。
题目描述
请判断是否存在一棵树满足如下条件。若存在,请尝试给出构造。
树中包含 n n n 个结点,编号为 1 ∼ n 1\sim n 1∼n。另外,给定 m m m 个点对 ( s i , t i ) (s_i,t_i) (si,ti),要求树上这 m m m 条从点 s i s_i si 到点 t i t_i ti 的路径覆盖每条边恰好一次 † ^\dagger †。
若你正确判断了是否有解,但不会构造出这棵树,也可以获得一定的分数,详见【评分方式】。
† \dagger † 称从点 s s s 到点 t t t 的路径覆盖一条边 ( u , v ) (u,v) (u,v),当且仅当边 ( u , v ) (u,v) (u,v) 在点 s s s 到点 t t t 的最短路径上。
输入格式
第一行包含两个整数 n , m n,m n,m,表示这棵树的点数和给出的点对数。
接下来 m m m 行,每行两个整数 s i , t i s_i,t_i si,ti,表示一个点对。
输出格式
第一行输出一个字符串 Yes 或 No(大小写不敏感),表示是否有解。
若有解,继续输出 n − 1 n-1 n−1 行,每行包含两个整数 u i , v i u_i,v_i ui,vi,描述一条边。你需要保证 1 ≤ u i , v i ≤ n \bm{1\le u_i,v_i\le n} 1≤ui,vi≤n 且所有边构成一棵树。
输入输出样例 #1
输入 #1
6 2
1 2
3 4
输出 #1
Yes
1 5
2 5
3 5
4 6
5 6
输入输出样例 #2
输入 #2
3 3
1 2
2 3
1 3
输出 #2
No
说明/提示
「样例解释 #1」

左上图为样例输出中给出的树。边 ( 1 , 5 ) , ( 5 , 2 ) (1,5),(5,2) (1,5),(5,2) 被路径 ( 1 , 2 ) (1,2) (1,2) 覆盖,边 ( 3 , 5 ) , ( 5 , 6 ) , ( 6 , 4 ) (3,5),(5,6),(6,4) (3,5),(5,6),(6,4) 被路径 ( 3 , 4 ) (3,4) (3,4) 覆盖,符合题目要求。
右上图中边 ( 5 , 6 ) (5,6) (5,6) 被路径 ( 1 , 2 ) (1,2) (1,2) 和 ( 3 , 4 ) (3,4) (3,4) 覆盖,不符合题目要求。
左下图中边 ( 5 , 6 ) (5,6) (5,6) 未被任何路径覆盖,不符合题目要求。
右下图不是一棵树,不符合题目要求。
「样例解释 #2」
可以证明不存在符合要求的树。
「评分方式」
本题采用自定义校验器(Special Judge)进行评测。
对于每个测试点:
- 若第一行格式错误或与答案不匹配(大小写不敏感),得 0 % 0\% 0% 的分数。
- 若第一行答案正确且为
No,得 100 % 100\% 100% 的分数。 - 若第一行答案正确且为
Yes,但后 n − 1 n-1 n−1 行格式错误,得 0 % 0\% 0% 的分数。
因此,请务必保证输出为一棵树。 - 若第一行答案正确且为
Yes,后 n − 1 n-1 n−1 行格式正确但树不符合要求,得 20 % 20\% 20% 的分数。 - 若第一行答案正确且为
Yes,后 n − 1 n-1 n−1 行格式正确且树符合要求,得 100 % 100\% 100% 的分数。
也就是说,对于第一个样例,在正确输出 Yes 的基础上,输出左上图可以得到满分,输出右上图、左下图可以得到
20
%
20\%
20% 的分数,输出右下图不能得到任何分数;对于第二个样例,正确输出 No 即可得到满分。
「数据范围」
对于所有测试数据,保证:
- 2 ≤ n ≤ 3 × 10 5 2\le n\le 3\times 10^5 2≤n≤3×105;
- 1 ≤ m ≤ 3 × 10 5 1\le m\le 3\times 10^5 1≤m≤3×105;
- 1 ≤ s i , t i ≤ n 1\le s_i,t_i\le n 1≤si,ti≤n 且 s i ≠ t i s_i\ne t_i si=ti。
本题采用捆绑测试。
- Subtask 0(10 points): n ≤ 3 n\le 3 n≤3, m ≤ 3 m\le 3 m≤3。
- Subtask 1(10 points): n ≤ 10 n\le 10 n≤10, m ≤ 10 m\le 10 m≤10。
- Subtask 2(20 points): m = 1 m=1 m=1。
- Subtask 3(10 points): n ≤ 300 n\le 300 n≤300, m ≤ 300 m\le 300 m≤300。
- Subtask 4(10 points): n ≤ 2 × 10 3 n\le 2\times 10^3 n≤2×103, m ≤ 2 × 10 3 m\le 2\times 10^3 m≤2×103。
- Subtask 5(20 points): m ≤ 2 × 10 3 m\le 2\times 10^3 m≤2×103。
- Subtask 6(20 points):无特殊限制。
「Hack 数据」
本题于赛后添加了部分 Hack 数据。这些数据均满足 Subtask 6 对数据规模的限制,他们被添加到 Subtask 7 中。这些数据不计分,但只有通过所有数据,才算做 AC 本题。
- Subtask 7(0 points):赛后添加的 Hack 数据。
C++实现
#include<bits/stdc++.h>
using namespace std;
#define N 300005
int n,m,f[N];
int find(int x){
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
int last,cnt=0;
struct node{
int x,y;
}e[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++){
cin>>e[i].x>>e[i].y;
if(find(e[i].x)!=find(e[i].y))
f[find(e[i].y)]=find(e[i].x);
else{
cout<<"No"<<'\n';
return 0;
}
}
cout<<"Yes"<<'\n';
for(int i=1;i<m;i++)
cout<<e[i].x<<" "<<e[i].y<<'\n';
last=e[m].x;
for(int i=1;i<=n;i++){
if(find(i)==i&&find(i)!=find(e[m].x)){
cout<<last<<" "<<i<<'\n';
last=i;
}
}
cout<<e[m].y<<" "<<last<<'\n';
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥题 P11486 「Cfz Round 5」Mata rainen&spm=1001.2101.3001.5002&articleId=165994564&d=1&t=3&u=8afeba3c04004ea18c6979483e6694cb)
194

被折叠的 条评论
为什么被折叠?



