小朋友学Codeforces(4):Round 453 DIV 2, C

xiaoxiao2021-02-28  45

题目

http://codeforces.com/contest/902/problem/C

分析

只要满足两个条件,即存在同构树: ①该节点上一层的节点数大于1, ②该节点所在层节点个数大于1。

以例2中的{1,2,2}为例:

只要将最后一个节点(即节点5),放到上一层的倒数第二个节点(即结点2)下,就形成了两棵同构树。

代码

#include<bits/stdc++.h> using namespace std; const int N = 200001; int main() { int height; // 树的高度 = 层数 - 1 int cnt[N]; // 每一层的节点总数 int parent = 0; // 根结点为1,其父节点为0 bool flag = 1; cin >> height; for(int layer = 0; layer <= height; layer++) { cin >> cnt[layer]; if(layer == 0) { continue; } if(cnt[layer - 1] != 1 && cnt[layer] != 1) { flag = 0; } } if(flag) { puts("perfect"); return 0; } puts("ambiguous"); for(int layer = 0; layer <= height; layer++) { // 输出该层节点的父节点 for(int node = 1; node <= cnt[layer]; node++) { cout << parent << " "; } // 父节点指向该层的最右的那个节点 parent += cnt[layer]; } printf("\n"); parent = 0; for(int layer = 0; layer <= height; layer++) { if(layer != 0 && cnt[layer - 1] != 1 && cnt[layer] != 1) { // 前n-1个节点的父节点还是原样输出 for(int node = 1; node <= cnt[layer] - 1; node++) { cout << parent << " "; } // 最后节点的父节点往左移一个位置 cout << parent - 1 << " "; parent += cnt[layer]; continue; } for(int node = 1; node <= cnt[layer]; node++) { cout << parent << " "; } parent += cnt[layer]; } return 0; }

更多内容请关注微信公众号

转载请注明原文地址: https://www.6miu.com/read-2631224.html

最新回复(0)