Codeforces Round #509 (Div. 2) E. Tree Reconstruction
Posted scaulok
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #509 (Div. 2) E. Tree Reconstruction相关的知识,希望对你有一定的参考价值。
题目链接:http://codeforces.com/contest/1041/problem/E
题意:给出n - 1对pair,构造一颗树,使得断开其中一条边,树两边的最大值为 a 和 b 。
题解:显示最大值出现的次数为n - 1,且i点出现的次数小于等于i。一个数字 i(< n)出现的次数为 i 到 n 的距离,可构造出一条链使得满足条件。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define LL __int128 5 #define ull unsigned long long 6 #define mst(a,b) memset((a),(b),sizeof(a)) 7 #define mp(a,b) make_pair(a,b) 8 #define fi first 9 #define se second 10 #define pi acos(-1) 11 #define pii pair<int,int> 12 #define pb push_back 13 const int INF = 0x3f3f3f3f; 14 const double eps = 1e-6; 15 const int MAXN = 1e3 + 10; 16 const int MAXM = 2e6 + 10; 17 const ll mod = 1e9 + 7; 18 19 int du[MAXN]; 20 21 int main() 22 { 23 #ifdef local 24 freopen("data.txt", "r", stdin); 25 // freopen("data.txt", "w", stdout); 26 #endif 27 int n; 28 scanf("%d",&n); 29 bool flag = true; 30 for(int i = 1; i < n; i++) { 31 int a,b; 32 scanf("%d%d",&a,&b); 33 du[a]++; 34 if(b != n) flag = false; 35 } 36 int now = 0; 37 for(int i = 1; i < n; i++) { 38 now += du[i]; 39 if(now > i) flag = false; 40 } 41 if(!flag) { 42 puts("NO"); 43 return 0; 44 } 45 puts("YES"); 46 set<int>se; 47 for(int i = 1; i <= n; i++) se.insert(i); 48 int pre = -1; 49 for(int i = 1; i < n; i++) { 50 if(du[i]) { 51 if(pre != -1) printf("%d %d ",pre,i); 52 pre = i; 53 du[i]--, se.erase(i); 54 } 55 while(du[i]) { 56 printf("%d %d ",pre,*se.begin()); 57 pre = *se.begin(); 58 du[i]--, se.erase(se.begin()); 59 } 60 } 61 printf("%d %d ",pre,n); 62 return 0; 63 }
以上是关于Codeforces Round #509 (Div. 2) E. Tree Reconstruction的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #509 (Div. 2) E. Tree Reconstruction
codeforces round#509(div2) E. Tree Reconstruction
Codeforces Round #436 E. Fire(背包dp+输出路径)
[ACM]Codeforces Round #534 (Div. 2)